Возвращаемые строковые значения из столбца в моем 2d-массиве сжимаются в одну строку (открытие файла txt для Windows на Mac OS) - PullRequest
0 голосов
/ 11 ноября 2019

Мне дали текстовый файл из 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

1 Ответ

2 голосов
/ 11 ноября 2019

С учетом симптомов и вашего кода это может быть вызвано только кодировкой файла, а точнее кодировкой разрыва строки :

  • Есть большие шансы, чтоу вас есть файл 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;
  }
...