从我的二维数组中的一列返回的字符串值被压缩成一个字符串(在 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;
}
有人给了我一个 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;
}