何时在c ++中执行getline函数调用时会设置failbit

时间:2011-07-14 00:11:46

标签: c++ file getline

什么时候c ++中的getline会失败?

我有一大段代码,由于各种原因,我无法将其全部粘贴。我试图从一个文件中读取,我知道存在并包含数据,在C ++中使用getline。但getline无法返回错误123-无效名称(getlasterror的输出)。我查了一下错误代码,这让我更加困惑。

打开文件时我会进行错误检查。所以我很肯定我有文件的句柄。 请不要粘贴我的代码。我是c ++的新手,特别是在windows中。有关getline的任何建议或见解都会有所帮助。我正在尝试读取由编译器转储的文件。

这是代码

的摘录
ifstream inFile("C:\...\ash.txt",ios::in);

string singleLine;

getline(inFile,singleLine);

singleLine是空的!我正在做些傻事......请指出我的意思!欣赏它

重要编辑:

我检查了ios成员,发现失败位已设置。为什么要设置失败位?该文件确实存在,我也想知道Windows暴露文件扩展名是否会导致问题。这似乎不是问题所在。我错过了什么?

5 个答案:

答案 0 :(得分:4)

GetLastError仅告诉您有关std::getline不是的Win32 API调用。

检查失败的iostream成员,例如rdstate()

ios::exceptions(eofbit | failbit | badbit)之前调用getline并捕获生成的异常可能会或可能不会为您提供更具描述性的错误消息。

答案 1 :(得分:1)

如果设置了fail位,可能是因为您没有成功打开该文件。检查ifFile.is_open()是否返回true;如果没有,则可能表示该文件未正确打开。您可能没有权限,或者您可能需要正确转义字符串,否则文件可能会被锁定。

您还应该检查fail来电之前和之后是否设置getline。如果是之前,那可能意味着该文件未打开。如果它在之后,则可能意味着该文件为空。

Windows可能会隐藏您的真实文件扩展名。例如,如果您将Explorer配置为隐藏文件扩展名,则文件名实际上可能名为ash.txt.txt。如果文件没有打开,这可能值得调查。

答案 2 :(得分:0)

您是否需要转义文件路径中的反斜杠?

答案 3 :(得分:0)

无法打开文件。

这是因为你没有指定正确的路径。

这是因为您使用了\的古老窗口约定作为路径分隔符 这也恰好是C中的转义字符。

这就是为什么Windows允许你使用/作为路径分隔符(并且已经完成了十多年),因为使用'/'非常容易出错。

你的道路应该是:

ifstream inFile("C:\\...\\ash.txt");

// Or my preference

ifstream inFile("C:/.../ash.txt");

甚至更好地使用提升。

答案 4 :(得分:-1)

Getline IIRC适用于c_strings,字符串是第一个参数,而不是第二个参数。

http://www.cplusplus.com/reference/iostream/istream/getline/

您正在尝试使用普通字符串,(我可能错了)不能与getline一起使用。