- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在解析如下所示的 CSV 文件:
E1,E2,E7,E8,,,
E2,E1,E3,,,,
E3,E2,E8,,,
E4,E5,E8,E11,,,
我将每行中的第一个条目存储在一个字符串中,其余的存储在一个字符串 vector 中:
while (getline(file_input, line)) {
stringstream tokenizer;
tokenizer << line;
getline(tokenizer, roomID, ',');
vector<string> aVector;
while (getline(tokenizer, adjRoomID, ',')) {
if (!adjRoomID.empty()) {
aVector.push_back(adjRoomID);
}
}
Room aRoom(roomID, aVector);
rooms.addToTail(aRoom);
}
在 Windows 中,这工作正常,但在 Linux 中,每个 vector 的第一个条目神秘地丢失了第一个字符。例如,在 while 循环的第一次迭代中:
roomID
将是 E1
而 aVector
将是 2
E7
E8
然后是第二次迭代:roomID
将是 E2
而 aVector
将是 1
E3
注意 aVector 的第一个条目中缺少的 E。
当我输入一些调试代码时,它似乎最初被正确地存储在 vector 中,但后来被某些东西覆盖了。感谢任何解决这个问题的人。我觉得很奇怪。
编辑:谢谢埃里克。我终于明白了。在 Windows 上,所有行都以\n 结尾。但是,当我切换到 Unix\Linux 时,这些行以\r\n 结尾。因此,当 getline
读取一行时,它会将所有内容读入字符串,包括\r。我没有考虑这个\r,它把我搞砸了。问题不在于 E 不见了。那是我在 vector 中有一个额外的条目,其中有一个\r 字符。我的其他类(class)无法处理其中包含单个\r 的条目。
最佳答案
糟糕:误读了您的问题,以为它是在谈论不能在 Windows 上工作。我在这里留下答案,以防有人偶然发现这个需要它,但我认为在这种情况下它不会帮助你(提问者)。
如果您使用的是 MSVC6,您可能会遇到 this bug使用 getline 函数。链接中有一个修复程序。
为了后代,这里是链接中的信息:
SYMPTOM: "The Standard C++ Library template getline function reads an extra character after encountering the delimiter. Please refer to the sample program in the More Information section for details."
Modify the getline member function, which can be found in the following system header file string, as follows:
else if (_Tr::eq((_E)_C, _D))
{_Chg = true;
// _I.rdbuf()->snextc(); /* Remove this line and add the line below.*/
_I.rdbuf()->sbumpc();
break; }
Note: Because the resolution involves modifying a system header file, extreme care should be taken to ensure that nothing else is changed in the header file. Microsoft is not responsible for any problems resulting from unwanted changes to the system header file
关于c++ - CSV 解析器适用于 Windows,不适用于 Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5060607/
我是一名优秀的程序员,十分优秀!