-1

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

我有一大段代码,由于多种原因,我无法完整粘贴。我正在尝试使用 C++ 中的 getline 从我知道存在并包含数据的文件中读取。但是 getline 无法返回错误 123-invalid name(getlasterror 的输出)。我查看了更让我困惑的错误代码。

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

这是代码的摘录

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

string singleLine;

getline(inFile,singleLine);

单行是空的!我正在做一些愚蠢的事情……请向我指出这一点!欣赏它

重要编辑:

我检查了 ios 成员,发现设置了失败位。为什么会设置失败位?该文件确实存在,而且我想知道 Windows 如何公开文件扩展名是否会导致问题。这似乎不是问题。我错过了什么?

4

5 回答 5

4

GetLastError仅告诉您有关 Win32 API 调用的信息,而事实std::getline并非如此。

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

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

于 2011-07-14T00:15:16.517 回答
1

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

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

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

于 2011-07-14T00:45:52.333 回答
0

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

于 2011-07-14T00:22:39.450 回答
0

它无法打开文件。

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

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

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

你的路径应该是:

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

// Or my preference

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

或者更好地使用boost。

于 2011-07-14T08:26:34.353 回答
-1

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

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

您正在尝试使用普通字符串,该字符串(我可能错了)不适用于 getline。

于 2011-07-14T00:20:03.573 回答