为什么我的fstream访问不编译?

时间:2015-03-08 17:36:29

标签: c++ eclipse fstream

我有问题。我正在用C ++编写一个程序,我想访问一些文件,所以我使用了类fstream。好吧,这里一切都好,但是当我要编译程序时它会崩溃并给我一个错误。

我把这里连接文件的代码放在这里:

#include <iostream>
#include <fstream>
#include <map>
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string>
#include <string.h>

using namespace std;

fstream file1, file2;

void access();

int main(){
   access();

   file1.close();
   file2.close();
}

void access(){

    file1("C:\\data\\file1.dat",ios::in | ios::out | ios::binary);
    cout << "Opening File1..." << endl;

    file2("C:\\data\\file2.dat",ios::in | ios::out | ios::binary);
    cout << "Opening File2..." << endl;

}

它给了我以下错误:

no match for call to '(std::fstream {aka std::basic_fstream<char>}) (const char [20], std::_Ios_Openmode)'

所以我尝试将方法设置为:

void access(){
        string f1 = "C:\\data\\file1.dat";
        string f2 = "C:\\data\\file2.dat";


        file1(f1.c_str(),ios::in | ios::out | ios::binary);
        cout << "Opening File1..." << endl;

        file2(f2.c_str(),ios::in | ios::out | ios::binary);
        cout << "Opening File2..." << endl;

    }

但它也给了我一个错误。其内容如下:

no match for call to '(std::fstream {aka std::basic_fstream<char>}) (const char*, std::_Ios_Openmode)'

我对发生的事情一无所知,任何帮助都会受到赞赏。

非常感谢。

3 个答案:

答案 0 :(得分:4)

即使看起来像它,它也不是对构造函数的调用,因为它已经在全局空间中声明和构造。

file1("C:\\data\\file1.dat",ios::in | ios::out | ios::binary);

这是对operator()的调用。请尝试使用open代替:

file1.open("C:\\data\\file1.dat",ios::in | ios::out | ios::binary);

答案 1 :(得分:1)

您的问题确实显示了为什么两个std::fstream变量应该是全局的。所以你可以在access

中创建局部变量

这是一个例子;请注意,虽然它包含一些其他奇怪的东西(例如包括许多你从未使用过的标题),但我还是没有触及程序的其余部分:

#include <iostream>
#include <fstream>
#include <map>
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string>
#include <string.h>

using namespace std;

void access();

int main(){
   access();
}

void access(){

    fstream file1("C:\\data\\file1.dat",ios::in | ios::out | ios::binary);
    cout << "Opening File1..." << endl;

    fstream file2("C:\\data\\file2.dat",ios::in | ios::out | ios::binary);
    cout << "Opening File2..." << endl;

}

答案 2 :(得分:1)

此语法无效:

file1("C:\\data\\file1.dat",ios::in | ios::out | ios::binary);

您可以使用这些参数来消耗流以进行inistialisation:

fstream file1("C:\\data\\file1.dat",ios::in | ios::out | ios::binary);

或者您打开已构建的流:

file1.open ("C:\\data\\file1.dat",ios::in | ios::out | ios::binary);

由于file1已在access()之外定义,因此第二个选项似乎最合适。