带有和不带有新行的文件读取

时间:2020-02-27 01:17:01

标签: c++ scanf eof

在读取输入文件方面,

  • 我找到了

    for (i = 0; !inStream.eof() ; i++) inStream >> input[i];
    

    如果文件末尾有“换行”,请尝试再读一次。

    for (i=0; inStream >> input[i]; i++ ) ; 
    

    无论文件末尾是否有新行,似乎都可以使用。

    在文件末尾是否还有其他整洁的解决方案来处理“换行”?

  • 在c中,我写

    FILE *fp = fopen("file", "r") ;
    for (i=0; fscanf(fp, "%d", & input[i]) > 0 ; i++ ) ;
    

有什么方法可以将fscanf与不使用fopen()的c ++输入文件流一起使用吗?

2 个答案:

答案 0 :(得分:3)

C ++库为您提供了方便的getline函数。这是cplusplus.com

中的一个最小示例
// reading a text file
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main () {
  string line;
  ifstream myfile ("example.txt");
  if (myfile.is_open())
  {
    while ( getline (myfile,line) )
    {
      cout << line << '\n';
    }
    myfile.close();
  }

  else cout << "Unable to open file"; 

  return 0;
}

答案 1 :(得分:0)

我可以将fscanf与c ++输入文件流一起使用吗?

可能。 g++和Visual Studio都有自己的扩展,使其成为可能。如果您发现这样的可能性,则它们是非标准且不可移植的。我建议您找到其他方法。

如果您使用C ++,请尝试使用其中的大部分内容。 C确实有fscanf,看上去很整洁-但这是野兽。 C ++具有std::scanf的可移植性-就像野兽一样。如果您正在编程C ++,请不要使用它。

您要避免的问题

for (i = 0; !inStream.eof() ; i++) inStream >> input[i];
如果文件末尾有“换行”,则尝试再读取一次。

是由于不正确使用eof()引起的。 eof()返回true,在您尝试读取文件末尾之后的 之后。更好的循环如下所示:

for (i = 0; inStream >> input[i] ; i++);

请注意,提取和条件如何成为一体?他们不是。首先进行提取,然后返回提取中使用的 stream 。流具有bool重载,它会告诉您是否处于故障状态,这使其非常适合以下检查:if(stream >> variable) { /* success */ } else { /* fail */ }

这仅在您的数组具有足以存储所有输入的条目时才有效。您的循环不会检查。如果您使用vector,则可以读取元素和push_back以使其长时间工作。如果您的尺寸固定(相对较小)并执行上述操作,则最终将失败。