尝试使用C ++,Ubuntu vs Mac读取ASCII文件中的行...?

时间:2015-11-02 13:16:41

标签: c++

我有一个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;
}

2 个答案:

答案 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