从我的2d数组中的一列返回的字符串值被压缩为一个字符串(在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)

本文关键字:字符串 文件 Mac 一个 os Windows txt 数组 2d 我的 一列      更新时间:2023-10-16

我得到了一个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 << "nArtisttttTitletttYearn" << 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

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

  • 很有可能你有一个windows文件,行以CR+LF结尾,但你在linux系统上阅读它,该系统只解析行的末尾为LF
  • 如果您使用二进制模式而不是文本模式读取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;
}