从二维数组中的列返回字符串值被压缩为一个字符串(在Mac OS上打开Windows txt文件)

问题描述 投票:0回答:1

我得到了一个52行的文本文件,并被要求读取该文件,将值存储到一个数组中,并将该数组中的值返回一行以模拟一个相册。

来自文本文件“ cd.txt”的行:

Pantera
Cowboys From Hell
1990
Megadeath
Rust in Peace
1990
Anthrac
Worship Music
2011

显示文件内容的代码:

void displayCollection()
{
  string album[17][3], myArray[52];
  string line;
  int loop = 0, loop1 = 0, loop2 = 1, loop3 = 2;
  ifstream myfile("cd.txt");

  while (getline(myfile, line)){
    myArray[loop] = line;
    loop += 1;
  }
  myfile.close();

  cout << "\nArtist\t\t\tTitle\t\t\tYear\n" << endl;
  for (int i = 0; i < 17; i++){
    album[i][0] = myArray[loop1];
    album[i][1] = myArray[loop2];
    album[i][2] = myArray[loop3];

    cout << album[i][0] << album[i][1] << album[i][2] << endl;

    loop1 += 3;
    loop2 += 3;
    loop3 += 3;
  }

}

如何打印格式:

Artist         Title                Year
Pantera        Cowboys From Hell    1990
Megadeath      Rust in Peace        1990
Anthrac        Worship Music        2011

实际打印的内容:

Artist         Title                Year
1990oys From Hell
1990 in Peace
2011hip Music
c++ string file-io text-files fstream
1个回答
2
投票

鉴于症状和您的代码,这只能由文件编码引起,更确切地说是由line break encoding

  • [很有可能您有一个Windows文件,其行以CR + LF结尾,但是您在linux系统上阅读了该文件,该行的结尾仅是LF。
  • 如果您使用binary mode instead of text mode读取Windows生成的文件,可能会发生同样的情况。但这不是您的代码中的情况。

结果,您的每个字符串都有一个结尾的CR字符(即'\ r',即0x0D)。显示它会导致光标移动该行的开头,以便下一个字符串覆盖前一个字符串。当然,当您选择endl时,您将跳至下一行。

解决方案:删除尾随的0x0D:

while (getline(myfile, line)){
    if (line.length()>0 && line[line.length()-1]=='\r') 
        line.pop_back(); 
    myArray[loop] = line; 
    loop += 1;
  }
© www.soinside.com 2019 - 2024. All rights reserved.