【问题标题】:Getting input from file troubles C++从文件中获取输入麻烦 C++
【发布时间】:2013-05-24 21:31:53
【问题描述】:

我一直在尝试从 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 的信息,但似乎找不到任何解决方案,因此不胜感激。

谢谢

【问题讨论】:

  • 尝试打印另一个 getline 的输出,看看你发现了什么。这与是否使用换行符有关。
  • 我猜这是因为 getline 在第一个字符串 (1234) 之后找到换行符并停止。

标签: c++ file input getline istream


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    Reference

    【讨论】:

      【解决方案3】:

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

      #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

      【讨论】:

        【解决方案4】:

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

        这是一个非常结构化的场景,通常在功课中找到。读取文本文件时更常见的情况是将整个文件视为基于行的文本。

        这样的话比较方便

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-23
          • 1970-01-01
          • 1970-01-01
          • 2011-05-24
          相关资源
          最近更新 更多