在读取输入文件方面,
我找到了
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 ++输入文件流一起使用吗?
答案 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
以使其长时间工作。如果您的尺寸固定(相对较小)并执行上述操作,则最终将失败。