模板函数在读取时返回错误的值

时间:2016-05-24 14:33:33

标签: c++ templates fstream

我正在尝试创建使用模板函数在c ++中读取和写入同一文件的类,并且我试图实现读取char或int的函数read()并返回它并且当我尝试运行它我得到的数字像-998324343请帮助:)

#include<iostream>
#include<fstream>    
using namespace std;

template <class T>
class myFile
{
    ifstream  in;
    ofstream out;

public:
    myFile(char* fileName)
    {

        in.open(fileName);
        if (!in.is_open())
            throw"couldnt open file to reading";
        out.open(fileName);
        if (!out.is_open())
            throw"couldnt open file to writing";

        cout << read();
    }

    T read() {
        T x;
        in >> x;
        return x;
    }
};

int main()
{
    try {
        myFile<int> a("read.txt");
    }
    catch (char* msg) {
        cout << msg << endl;
    }
}

1 个答案:

答案 0 :(得分:0)

您的outin引用了同一个文件。所以当发生这种情况时:

in.open(fileName);
if (!in.is_open())
    throw"couldnt open file to reading";
out.open(fileName); 

假设fileName作为文件存在,out将截断文件,因此它变为空。随后的in >> x;将失败(因为文件为空)并且根据您正在编译的C ++标准,x将被清零(自C ++ 11以来)或保持不变(直到C ++ 11)。我假设您正在编译pre-C ++ 11,在这种情况下,您看到的是初始化的任何不确定值x

不确定您需要out,但您要么引用其他文件,要么以追加模式打开它。

无论out是否截断文件,>>操作都可能失败。如果失败,您将获得垃圾数据(或0)。所以你需要检查该操作的结果。

注意:您使用char*的任何地方都应使用const char*。不推荐使用从字符串文字到char*的转换(如果在编译时启用了警告,您会看到这一点)。