c++ getline 在 Windows 中读取整个文件
c++ getline reads entire file in Windows
这看起来像是与 this one 类似的问题,但我认为我的情况实际上可能有点不同。代码如下:
void readOmronResults(string fileName)
{
ifstream inFile(fileName);
ofstream testRead("test_read.txt");
string line;
//getline(inFile, line);
//cout << line << endl;
while (getline(inFile, line))
{
testRead << line << endl;
}
inFile.close();
testRead.close();
cout << "Finished reading omron results" << endl;
}
testRead只是用来调试的。输入文件是一个 .csv 文件,如下所示:
IMAGE,RIGHT_EYE_IN_X,RIGHT_EYE_IN_Y,RIGHT_EYE_OUT_X,RIGHT_EYE_OUT_Y,LEFT_EYE_IN_X,LEFT_EYE_IN_Y,LEFT_EYE_OUT_X,LEFT_EYE_OUT_Y
0001_2m_-15P_-10V_-10H,2386,1627,2171,1613,2754,1623,3009,1583
0001_2m_-15P_-10V_-15H,2377,1620,2171,1606,2750,1611,3003,1574
0001_2m_-15P_-10V_-5H,2376,1614,2166,1599,2752,1609,3012,1577
...
如果我运行上面的代码,test_read.txt中的输出与输入文件中的完全一样。但是,如果我恢复两条注释掉的行,控制台 window 会显示输入文件中的所有行(从第二行开始重复)并且 test_read.txt 为空。从链接 post 我猜想这可能与不同操作系统中行尾的差异有关。我的操作系统是 Windows,根据我的文本编辑器,原始输入文件是 Mac-OS 样式。但如果是因为这个,为什么原来的代码(注释掉的那两行)能够给出正确的结果呢?
我的 IDE 是 Visual Studio 2012,我的机器是 64 位的。
如果它们是 Mac OS 结尾 '\r'
,根据文档:http://www.cplusplus.com/reference/string/string/getline/ 这种行为并不奇怪。
释义文档:当不提供定界符时,getline
将准备就绪,直到遇到换行符 ('\n'
)。
My operating system is Windows and according to my text editor the original input file is Mac-OS style.
是的,就是这个问题。 Windows' C 和 C++ 标准库将假设文本文件使用 Windows 行结尾,U+0D U+0A
.
"Mac OS style" 对于文本编辑器来说是一个奇怪的事情,因为另一行以常用 U+0A
结尾,这对包括 Linux 在内的整个 Unix 系列都是通用的。很久以前,Mac OS 使用 U+0D
这使得短语 "Mac OS style" 模棱两可且不合时宜。
But if it is because of this, why is the original code (with the two lines commented out) able to give a correct result?
没有。该程序的两个版本都将文件视为包含很长的一行。
这看起来像是与 this one 类似的问题,但我认为我的情况实际上可能有点不同。代码如下:
void readOmronResults(string fileName)
{
ifstream inFile(fileName);
ofstream testRead("test_read.txt");
string line;
//getline(inFile, line);
//cout << line << endl;
while (getline(inFile, line))
{
testRead << line << endl;
}
inFile.close();
testRead.close();
cout << "Finished reading omron results" << endl;
}
testRead只是用来调试的。输入文件是一个 .csv 文件,如下所示:
IMAGE,RIGHT_EYE_IN_X,RIGHT_EYE_IN_Y,RIGHT_EYE_OUT_X,RIGHT_EYE_OUT_Y,LEFT_EYE_IN_X,LEFT_EYE_IN_Y,LEFT_EYE_OUT_X,LEFT_EYE_OUT_Y
0001_2m_-15P_-10V_-10H,2386,1627,2171,1613,2754,1623,3009,1583
0001_2m_-15P_-10V_-15H,2377,1620,2171,1606,2750,1611,3003,1574
0001_2m_-15P_-10V_-5H,2376,1614,2166,1599,2752,1609,3012,1577
...
如果我运行上面的代码,test_read.txt中的输出与输入文件中的完全一样。但是,如果我恢复两条注释掉的行,控制台 window 会显示输入文件中的所有行(从第二行开始重复)并且 test_read.txt 为空。从链接 post 我猜想这可能与不同操作系统中行尾的差异有关。我的操作系统是 Windows,根据我的文本编辑器,原始输入文件是 Mac-OS 样式。但如果是因为这个,为什么原来的代码(注释掉的那两行)能够给出正确的结果呢?
我的 IDE 是 Visual Studio 2012,我的机器是 64 位的。
如果它们是 Mac OS 结尾 '\r'
,根据文档:http://www.cplusplus.com/reference/string/string/getline/ 这种行为并不奇怪。
释义文档:当不提供定界符时,getline
将准备就绪,直到遇到换行符 ('\n'
)。
My operating system is Windows and according to my text editor the original input file is Mac-OS style.
是的,就是这个问题。 Windows' C 和 C++ 标准库将假设文本文件使用 Windows 行结尾,U+0D U+0A
.
"Mac OS style" 对于文本编辑器来说是一个奇怪的事情,因为另一行以常用 U+0A
结尾,这对包括 Linux 在内的整个 Unix 系列都是通用的。很久以前,Mac OS 使用 U+0D
这使得短语 "Mac OS style" 模棱两可且不合时宜。
But if it is because of this, why is the original code (with the two lines commented out) able to give a correct result?
没有。该程序的两个版本都将文件视为包含很长的一行。