C ++ getline 在 Windows 中读取整个文件
c++ getline reads entire file in Windows
这看起来像是一个与此类似的问题,但我认为我的情况实际上可能有点不同。代码如下:
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中的输出与输入文件中的输出完全相同。但是,如果我恢复两个注释掉的行,控制台窗口将显示输入文件中的所有行(从第二行重复),并且test_read.txt为空。从链接的帖子中,我想这可能与不同操作系统中行尾的差异有关。我的操作系统是Windows,根据我的文本编辑器,原始输入文件是Mac-OS风格。但如果正因为如此,为什么原始代码(注释掉了两行)能够给出正确的结果?
我的IDE是Visual Studio 2012,我的机器是64位的。
我的操作系统是Windows,根据我的文本编辑器,原始输入文件是Mac-OS风格。
是的,这就是问题所在。Windows 的 C 和 C++ 标准库将假定文本文件使用 Windows 行结尾,U+0D U+0A
。
"Mac OS风格"对于文本编辑器来说是一个奇怪的事情,因为另一行以通用U+0A
结尾,这是整个Unix家族(包括Linux)所共有的。很久以前,Mac OS使用了U+0D
这使得"Mac OS风格"一词模棱两可且不合时宜。
但如果正因为如此,为什么原始代码(注释掉了两行)能够给出正确的结果?
它没有。该程序的两个版本都将文件视为包含一行很长的行。
如果它们是 Mac OS 结尾'r'
,根据文档: http://www.cplusplus.com/reference/string/string/getline/这种行为并不奇怪。
释义文档:当不给出分隔符时,getline
将准备就绪,直到遇到换行符('n'
)字符。
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 读取文件的最后一行并输入到链接列表时出错
- 为什么在读取文件大小时文件IO速度会发生变化
- 读取文件时运行时的未知行为
- 如何逐行读取文件,每行中的内容都用空格分隔并将其写入新文件中
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- C++ 读取文件读取文件不正确
- 读取文件并将其存储在unordered_map中时出现问题
- 读取文件时无法使用 OpenMP 获得加速
- 使用istringstearm和get行缓慢读取文件
- 如何继续读取不同功能中的文件,而不是从头开始再次读取文件?
- 读取文件时引发异常
- 从标准输入读取文件后读取用户输入
- 在读取文件后重置句柄
- 如何在C++编译时读取文件?
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- 读取文件在第二次调用时返回INVALID_HANDLE
- 通过指针读取文件
- 逐行读取文件,并将数据插入变量和数组中