C++ c++;getline读取整个文件

C++ c++;getline读取整个文件,c++,file,text,getline,C++,File,Text,Getline,我使用std::getline()逐行读取文本文件。但是,对getline的第一个调用正在读取整个文件!我还尝试将delimeter显式指定为“\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::getline()逐行读取文本文件。但是,对getline的第一个调用正在读取整个文件!我还尝试将delimeter显式指定为“\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
我正在使用VisualStudio2008。文本文件有570行(我在记事本++fwiw中查看)


编辑:我解决了这个问题,使用记事本++将输入文本文件中的行尾转换为“Windows”行尾。该文件是用“\n”在每行的结尾用C++代码编写的。为什么getline()需要Windows行结尾(\r\n)??这与字符宽度或Microsoft实现有关吗?

只是猜测,但是您的文件是否有Unix行结尾,并且您正在Windows上运行?

您将在代码中看到的新行(
'\n'
)与平台的实际行结尾表示(回车(CR)的某种组合)混淆了和换行(LF)字节)

标准I/O库函数会自动将平台的行尾转换为文本模式流的概念换行(默认)。请参阅comp.lang.c常见问题解答。(虽然这是从C FAQ中,概念也适用于C++。)因为你在Windows上,默认的标准I/O函数将CRE-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);
或:


你能发布文件的前10行吗?我很确定getline()默认为
'\n'
作为分隔符。。我不明白为什么回车会影响它。标准I/O库函数读取和写入平台的行尾。针对Windows C或C++运行时构建的程序因此期望Windows行结束(令人震惊)。谢谢,詹姆斯。我认为,链接到证实这种行为的文档将比讽刺更有帮助。+1只是为了解释。。。在UNIX/Linux上,一个换行符(ASCII代码10)分隔行,而在Windows上,需要回车符(13)和换行符。因此,如果您的文件只有线性提要,则它们可能不会被C++识别为行分隔符,即使有些编辑器会识别它们并向您显示具有预定行中断的文件内容。但我不理解的是,当文件的文档称它使用“\n”(UNIX)时,为什么GETINLINE()需要Windows行结束(\r\n)。单用测线仪?此外,我明确地将delimeter设置为“\n”以确保。您是说文档和它的实际工作方式之间确实存在差异吗?谢谢你的回复。
 std::ifstream in(filename, std::ios::binary);