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

Returning string values from a column in my 2d array are being compressed into one string (opening Windows txt file on Mac os)

有人给了我一个 52 行的文本文件,并告诉我读取该文件,将值存储到一个数组中,然后 return 将该数组中的值放在一行中以模拟相册。

文本文件中的行 "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

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

  • 您很可能得到一个 windows 文件,其行以 CR+LF 结尾,但您是在 linux 系统上读取它的,该系统解析 for 和 end of行仅是 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;
  }