Использовал .ignore ('\ n') и следующая функция Getline берет только половину ввода из файла - PullRequest
0 голосов
/ 24 апреля 2020

Я пытался убедиться, что то, что я спрашиваю, не является дубликатом, так как это должно быть очень ошибкой новичка, но я не мог найти что-то похожее, но если бы кто-то имел ссылку на подобный пост, который был бы великолепен как ну в любом случае, поэтому я пытаюсь сделать игру на линкоре, которая читает размещение кораблей из файла .csv, но перед тем, как размещать корабли, проходит через файл и проверяет, все ли корабли найдены в файле.

Данные в файле отформатированы следующим образом:

Carrier,B2,H
Battleship,D4,V
Cruiser,G4,H
Submarine,G5,V
Destroyer,G8,H

Часть, которая вызывает у меня проблемы в моем коде, - это блок:

cout << "File successfully located!\n Making sure all ships are in file...\n";
while (shipPlacement.good()) {
        getline(shipPlacement, shipType, ',');
        cout << shipType << endl;
        shipPlacement.ignore('\n');
    }

Я хочу, чтобы он занимал только в типе линкора и игнорируйте все остальное в файле. Первая строка читается правильно, она перестает читать до установленного разделителя, отлично! и затем я хочу, чтобы он игнорировал все, что следует до следующей строки, поэтому я помещаю shipPlacement.ignore ('\ n'), и с этого момента он должен снова прочитать l oop на следующем корабле вплоть до разделителя, et c. я что-то здесь упускаю? то, что происходит, - это только половина типа корабля, принимаемая в качестве входных данных. Это вывод, который я получаю:

Making sure all ships are found in file...
Carrier
leship
ser
arine
royer

Это, вероятно, простое исправление, но я не вижу, что передо мной это выглядит, Любая помощь или руководство приветствуются!

1 Ответ

2 голосов
/ 24 апреля 2020

Первый аргумент ignore - это максимальное количество символов, которое нужно отбрасывать, а не разделитель (и, поскольку вы не указали разделитель, он всегда отбрасывал максимум). Ваш \n интерпретируется в двоичном виде как число 10, что приводит к пропуску следующих 10 символов (,B2,H⏎Batt). Вместо этого вы должны сделать shipPlacement.ignore(x, '\n'), где x - это наибольшее количество символов, которое вы когда-либо ожидали увидеть перед новой строкой.

...