我有一个ASCII文件(students.txt),如下所示(忽略空行,它们是我对这种格式化工具不熟悉的神器):
stella 10 4.4 ...
peter 1.1 5 ...
也就是说,每一行都以一个名称开头,后跟一个或多个数字。
下面的代码片段是逐行读取此文件,将名称读入字符串,将数字转换为double,依次打印每个文件。当我在Ubuntu上运行它时,它工作正常,我得到了
stella 10 4.4
peter 1.1 5
但是,当我在Mac上运行它时,我得到以下内容:
stella 10 4.4
ter 1.1 5
当我改变彼得'但是,它可以正常工作......
stella 10 4.4
speter 1.1 5
有什么想法......?
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
ifstream infile("students.txt");
string name;
double x;
while ( !infile.eof() ) {
infile >> name;
cout << name << ' ';
while ( infile >> x ){
cout << x << ' ';
}
cout << endl;
if (! infile.eof() )
infile.clear();
}
return 0;
}
答案 0 :(得分:0)
当输入开始分成行时,通常最容易按行读取,然后将它们拆分成组件:
std::string line;
std::string name;
std::vector<double> values;
while (std::getline(infile, line)) {
std::istringstream buffer(line);
double temp;
buffer >> name;
while (buffer >> temp)
values.push_back(temp);
}
答案 1 :(得分:0)
我特别感兴趣为什么我的代码片段在linux和mac上产生不同的结果...
我认为这种行为是由于Libc ++与Libstdc ++(而不是Mac与Ubuntu)在输入流中处理浮点输入的方式不同
自Apple deprecated Libstdc++(Linux中标准的GNU标准C ++库)以来,您很可能在Mac上使用Libc ++(LLVM / Clang的标准C ++库)。
在这种情况下,Libc ++会“吃掉”所有可能转换为双精度字符的字符,而Libstdc ++不会(例如吃掉pe
中的peter
,因为{{1} }和p
可能是double表示形式的一部分。
例如,如果您的e
如下所示:
students.txt
当您使用Libstdc ++编译原始程序并运行它时,您将得到:
0x1a 90.2 84.3
0x1a 1.5 56.4
使用Libc ++编译并运行时给出:
0x1a 90.2 84.3 0
x1a 1.5 56.4
Libc ++将0x1a 90.2 84.3 26 1.5 56.4
识别为十六进制数字(26),而Libstdc ++仅将0x1a
中的0
转换为0x1a
并将其解析为字符串名称。
有关包括示例的详细说明,请参见https://github.com/tardate/LittleCodingKata/blob/master/cpp/DoubleTrouble/README.md