将 fstream 数组传递给函数?
Passing an array of fstreams to a function?
我基本上是在写这个:-
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::vector
或std::array
。
阅读有关五法则的信息。
使用std::sort
.您可以将 lambda 表达式传递给它,给出比较条件。
您无法轻松比较std::fstream
-s,因为它们不保留其文件路径。一旦你为fstream
提供了一些路径(通过open
或在施工时),该路径就会丢失。您需要自己明确保留它。
如果您想按其他一些标准(例如它们的内容)比较文件,您将更好地记住该标准(例如,将它们的内容保存在一些单独的数据中)。任何排序函数都需要多次比较元素(因为排序复杂度至少为 O(n log n)....),因此在比较函数中执行 IO 是不合理的。同样,如果您想通过某些元数据(例如文件的大小和/或创建时间)比较文件,最好在排序之前检索一次元数据(例如,在 Linux 上使用 stat(2)。
也许你想定义你自己的class
或struct
,它同时保持一个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 */ }
- 自定义 std::fstream,std::filebuf 的溢出和下溢函数未为每个字符调用
- 如何修复函数中的 fstream 文件输入以将正确的信息存储在结构数组中?
- 在链表上写入和读取 fstream 的函数
- 将 fstream 数组传递给函数?
- 为什么在破坏函数函数中fstream Zero ernno
- C++:尝试将 fstream 作为参数传递时删除了函数?
- 如何通过函数参数使用 fstream(特别是 ofstream)
- 通过 fstream 函数初始化 int 向量??C++
- c++fstream read()函数不起作用
- c++向类成员发送引用fstream函数问题
- 将 fstream ">>" 作为函数参数传递
- 导致访问冲突的 fstream 构造函数
- 在类中使用fstream getline()函数
- fstream作为bool和fstream.good()函数的行为
- 如果fstream.open()在子函数中失败,如何退出程序
- std::getline函数(fstream _Lock())出错
- 使用fstream构造函数和打开函数的区别
- 什么fstream写函数写到文件(编码在post)
- 在同一个fstream对象上使用getline的两个函数
- 在fstream/ifstream文件中使用多个函数