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

when would failbit be set while executing a getline function call in c++

本文关键字:何时 设置 failbit 函数调用 c++ 执行 getline      更新时间:2023-10-16

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如何暴露文件扩展名可能会导致问题。那似乎不是问题。我错过了什么?

GetLastError只告诉你Win32 API调用,std::getline没有。

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

getline之前调用ios::exceptions(eofbit | failbit | badbit)并捕获所产生的异常可能会也可能不会得到一个更具描述性的错误消息。

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

您还应该检查fail是否在调用getline之前和之后都设置了。如果是之前,那可能意味着文件没有打开。如果是after,则可能表示文件为空。

可能是Windows对您隐藏了真正的文件扩展名。例如,如果将资源管理器配置为隐藏文件扩展名,则文件名实际上可能命名为ash.txt.txt。如果文件没有打开,这可能值得调查。

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

打开文件失败。

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

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

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

你的路径应该是:

ifstream inFile("C:\...\ash.txt");
// Or my preference
ifstream inFile("C:/.../ash.txt");

或者更好的使用boost

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

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

你试图使用一个正常的字符串,这(我可能是错的)不工作与getline.