c ++ getline读取整个文件

时间:2012-08-28 03:14:52

标签: c++ file text getline

我正在使用std :: getline()逐行读取文本文件。但是,第一次调用getline是读取整个文件!我也尝试明确地将分隔符指定为'\ n'。有什么想法可能会发生这种情况吗?

我的代码:

std::ifstream serialIn;
...
serialIn.open(argv[3]);
...
std::string tmpStr;
std::getline(serialIn, tmpStr, '\n');
// All 570 lines in the file is in tmpStr!
...
std::string serialLine;
std::getline(serialIn, serialLine);
// serialLine == "" here

我正在使用Visual Studio 2008.文本文件有570行(我在Notepad ++ fwiw中查看)。

编辑:我通过使用Notepad ++将输入文本文件中的行结尾转换为“Windows”行结尾来解决此问题。使用c ++代码在每行末尾用'\ n'编写文件。为什么getline()需要Windows行结尾(\ r \ n)?这与字符宽度或Microsoft实现有关吗?

2 个答案:

答案 0 :(得分:6)

猜猜,但你的文件是否有Unix行结尾,而你在Windows上运行?

答案 1 :(得分:3)

您在代码('\n')中看到的换行符与平台的实际行结束表示相混淆(某些运输组合 - 返回(CR)和换行(LF)字节。

标准I / O库函数自动将平台的行结尾转换为文本模式流的概念换行符(默认值)。请参阅comp.lang.c常见问题解答中的What's the difference between text and binary I/O? 。 (虽然这是来自C FAQ,但这些概念也适用于C ++。)由于您使用的是Windows,标准I / O函数默认将新行写为CR-LF,并在读取时期望CR-LF用于换行。

如果您不希望完成这些转换,并且希望查看原始的,未掺杂的数据,那么您应该将流设置为二进制模式。在二进制模式下,\n仅对应LF,\r仅对应CR。

在C中,您可以通过将"b"作为其中一个标记传递给fopen来指定二进制模式:

FILE* file = fopen(filename, "rb"); // Open a file for reading in binary mode.

在C ++中:

 std::ifstream in;
 in.open(filename, std::ios::binary);

或:

 std::ifstream in(filename, std::ios::binary);