从文件故障中获取输入C ++

时间:2013-05-29 14:44:08

标签: c++ file input getline istream

我一直在尝试用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 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

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

使用另一条获取线来检索第二行文字。

Reference

答案 2 :(得分: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;
}

此外,我建议您使用string代替char[]并使用the other getline function

答案 3 :(得分:0)

您遇到的问题是1234之后的第一个换行符未被input_stream>>(int)使用;所以下一个getline只读到该文件的末尾。

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

在这种情况下更方便

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

}

是合适的,并且不易出错。

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