c++ - 模板函数在读取时返回错误值

标签 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;
    }
}

最佳答案

您的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)。我假设您正在编译 C++11 之前的版本,在这种情况下,您看到的是 x 初始化时使用的任何不确定值。

不确定您需要 out 做什么,但您要么希望它引用不同的文件,要么以追加模式打开它。

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


注意:无论你在哪里使用char*,你都应该使用const char*。从字符串文字到 char* 的转换已弃用(如果您在启用警告的情况下进行编译,您会看到这一点)。

关于c++ - 模板函数在读取时返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37416636/

相关文章:

c++ - 检测已知中心的部分隐藏椭圆的边界(OpenCV)

c++ - 编译时类型检查 C++

C++ Fstream 输出不起作用

c++ - 如何将json文件读入C++字符串

c++ - 什么是在 c++ 中获取按值排序的列表中元素的序号位置的算法或代码

c++ - 如果无法打开文件,则显示错误消息,C++

c++ - Ruby - 将方法作为回调传递给 DLL 库

c++ - 具有额外私有(private)属性的派生类

c++ - 是否在编译时评估 C++ 中对文字的算术运算?

C++11:模板中的(递归)指针算术 (TMP)