1

我一直在尝试从 C++ 中的 .txt 文件中读取一些信息,但它并没有像我预期的那样工作。这是一些示例代码:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    char words[255];
    int value = 0;

    ifstream input_stream("test.txt");

    input_stream >> value;
    input_stream.getline(words, 256);

    cout << value << endl;
    cout << words << endl;
}

并且 test.txt 包含:

1234
WordOne WordTwo

我期望代码打印文本文件中包含的两行,但我只是得到:

 1234

我一直在阅读有关 getline 和 istream 的信息,但似乎找不到任何解决方案,因此将不胜感激。

谢谢

4

4 回答 4

3

读取整数后,换行符保留在输入流中:

// Always check result to ensure variables correctly assigned a value.
if (input_stream >> value)
{
}

然后,调用getline()读取换行符并停止,产生一个空字符串。要更正,请在调用之前使用换行符getline()(选项包括 usinggetline()ignore())。

请注意,有一个版本std::getline()接受 astd::string作为其参数以避免使用固定大小的数组char,该数组在发布的代码中使用不正确。

于 2013-05-29T14:47:19.667 回答
0

这是您的原始代码的稍微更正的版本:

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    char words[256];                  // was 255
    int value = 0;

    ifstream input_stream("test.txt");

    input_stream >> value;
    input_stream.ignore();            // skip '\n'
    input_stream.getline(words, 256);

    cout << value << endl;
    cout << words << endl;
}

另外,我建议您使用 astring而不是 achar[]并使用other getlinefunction

于 2013-05-29T14:51:32.383 回答
0

ifstream 的 getline 方法收集输入,直到命中两个选项之一。达到终止字符或传入的大小。在您的情况下,在达到大小之前遇到换行符终止符。

使用另一个 getline 检索第二行文本。

参考

于 2013-05-29T14:49:11.067 回答
0

您看到的问题是后面的第一个换行符1234没有被input_stream>>(int);消耗掉。所以下一个 getline 只读取到该文件的末尾。

这是一个非常构建的场景,通常在学校作业中找到。读取文本文件时更常见的情况是将整个文件视为基于行的文本。

这种情况下更方便

string line;
while( std::getline( input_stream, line ) ){

}

是合适的,而且更不容易出错。

文本文件通常具有预定义的格式。也许是行,并且在从文件中读取该行之后name = value被解析。

于 2013-05-29T14:55:20.420 回答