将 fstream 数组传递给函数?

Passing an array of fstreams to a function?

本文关键字:函数 fstream 数组      更新时间:2023-10-16

我基本上是在写这个:-

void function(fstream& f[], int m){
// using fstream objects
}
int main()
{
int m = 4;
fstream f[m];
f[0].open("f0.txt");
f[1].open("f1.txt");
f[2].open("f2.txt");
f[3].open("f3.txt");
function(f, m);
return 0;
}

以下是即将出现的错误:-

error: declaration of ‘f’ as array of references|
error: expected ‘)’ before ‘,’ token|
error: expected unqualified-id before ‘int’|

所有这些错误都在线上

void function(fstream& f[], int m){

如果我只是初始化函数中的 fstream 数组,错误就会消失。如果我在 main 函数中初始化错误,我应该怎么做才能删除错误?

主要问题是您尝试传递指向引用的指针,而不是数组。要解决此问题,您应该传递一个真正的指针fstream *或者(最好)使用 ::std::array:

using t_FileStreams = ::std::array<::std::fstream, 4>;
void sort(t_FileStreams & streams){
// using fstream objects
}
int main()
{
t_FileStreams f;
f[0].open("f0.txt");
f[1].open("f1.txt");
f[2].open("f2.txt");
f[3].open("f3.txt");
sort(f);
return 0;
}

或者,如果事先不知道项目数量,您可能需要使用std::vector<::std::fstream>。另请注意,代码int m = 4; fstream f[m];在C++中是不合法的,因为数组大小必须是编译时已知的常量。

考虑使用一些标准容器,可能是std::vectorstd::array

阅读有关五法则的信息。

使用std::sort.您可以将 lambda 表达式传递给它,给出比较条件。

您无法轻松比较std::fstream-s,因为它们不保留其文件路径。一旦你为fstream提供了一些路径(通过open或在施工时),该路径就会丢失。您需要自己明确保留它。

如果您想按其他一些标准(例如它们的内容)比较文件,您将更好地记住该标准(例如,将它们的内容保存在一些单独的数据中)。任何排序函数都需要多次比较元素(因为排序复杂度至少为 O(n log n)....),因此在比较函数中执行 IO 是不合理的。同样,如果您想通过某些元数据(例如文件的大小和/或创建时间)比较文件,最好在排序之前检索一次元数据(例如,在 Linux 上使用 stat(2)。

也许你想定义你自己的classstruct,它同时保持一个std::string和一个智能指针(例如一些std::unique_ptr)到某个std::fstream

然后,您将通过引用或const引用将此类对象的容器传递给函数。

在编码之前,花几天时间阅读一本关于C++编程的好书。

请注意,IO 操作通常非常慢。它们可能持续几毫秒(而大多数 CPU 操作只需要纳秒)。因此,在传递给某个排序函数的比较代码中执行 IO 通常是不合理的。

要将任意大小的数组传递给函数,您可以使用数组引用(声明为Type(&Identifier)[Size])和模板。

#include <cstddef>
template<std::size_t N>
void sort(std::ifstream(&ins)[N]) { /* implementation */ }

N是数组ins的大小,可以在sort的函数体内使用,就好像它是一个普通的参数一样。

如果数组只有一个大小,则可以省略模板。

void sort(std::ifstream(&ins)[4]) { /* implementation */ }

这也适用于std::array.

#include <array>
#include <cstddef>
template<std::size_t N>
void sort(std::array<std::ifstream, N> &ins) { /* implementation */ }