将一组fst​​ream传递给函数?

时间:2017-11-08 05:25:52

标签: c++ fstream

我基本上是这样写的: -

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函数中初始化它们,我该怎么做才能删除错误?

3 个答案:

答案 0 :(得分:1)

主要问题是您尝试将指针传递给引用,而不是数组。要解决这个问题,你应该传递一个真正的指针window.stop(); var xhr = new XMLHttpRequest(); xhr.open('GET', window.location.href, true); xhr.onload = function () { var htmlcode = this.responseText; ... modify htmlcode ... document.open(); document.write(htmlcode); document.close(); } xhr.send(); 或(更好)使用:: std :: array代替:

fstream *

或者,如果事先不知道项目数量,您可能希望使用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>在C ++中是不合法的,因为数组大小必须是编译时已知的常量。

答案 1 :(得分:0)

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

了解rule of five

使用std::sort。您可以将lambda expression传递给它,给出比较标准。

您无法轻易比较std::fstream - s,因为他们不会保留file path。在您提供fstreamopenconstruction时间)的路径后,该路径将丢失。你需要自己明确

如果您想通过其他一些标准(例如其内容)来比较文件,那么您可以更好地memoize该标准(例如,将其内容保存在某些单独的数据中)。任何排序函数都需要比较元素几个次(因为排序复杂性至少 O(n log n)....),所以在比较中做IO功能不合理。同样,如果您想通过某些元数据(例如它们的大小和/或创建时间)来比较文件,那么最好在排序之前检索一次元数据(例如在Linux上使用stat(2))。

也许你想要定义自己的classstruct,它会将std::stringsmart pointer(例如某些std::unique_ptr)保留给某些std::fstream 1}}。

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

在编码前花几天时间阅读good book on C++ programming

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

答案 2 :(得分:0)

要将任意大小的数组传递给函数,您可以使用数组引用(声明为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 */ }