Чтобы упростить, я пытаюсь прочитать содержимое CSV-файла, используя класс ifstream и его функцию getline(). Вот этот CSV-файл:Неожиданное поведение getline() с ifstream
1,2,3
4,5,6
И код:
#include <iostream>
#include <typeinfo>
#include <fstream>
using namespace std;
int main() {
char csvLoc[] = "/the_CSV_file_localization/";
ifstream csvFile;
csvFile.open(csvLoc, ifstream::in);
char pStock[5]; //we use a 5-char array just to get rid of unexpected
//size problems, even though each number is of size 1
int i =1; //this will be helpful for the diagnostic
while(csvFile.eof() == 0) {
csvFile.getline(pStock,5,',');
cout << "Iteration number " << i << endl;
cout << *pStock<<endl;
i++;
}
return 0;
}
Я ожидаю, что все номера для чтения, так как GetLine предполагают, чтобы принять то, что написано после последнего чтения, и останавливаться при встрече «,» или «\ n».
Но, похоже, что он читает все хорошо, КРОМЕ «4», то есть первый номер второй линии (см консоли):
Iteration number 1
1
Iteration number 2
2
Iteration number 3
3
Iteration number 4
5
Iteration number 5
6
Таким образом, мой вопрос: что делает это «4» после (Я думаю), '\ n' настолько специфичен, что getline даже не пытается учесть это?
(Спасибо!)
«Что вы ожидали?» На самом деле, если взглянуть на http://www.cplusplus.com/reference/iostream/istream/getline/, мне кажется, что getline действует с '\ n' так же, как и с указанным разделителем. А именно, просто останавливаясь, чтобы читать, когда он встречается (таким образом, как и с «1,2», он останавливается до 2, а «3 \ n4» должен остановиться до 4). Но я думаю, что это не тот случай, я не понимаю, что все хорошо! Спасибо за ответ. – Kamixave
@Kamixave: С моим чтением cplusplus.com я не думаю, что это неправильно.'\ n' - это только разделитель по умолчанию, если вы его не поставляете. Если вы поставляете один, он используется вместо него (не так). –
@Charles Bailey: Не могли бы вы добавить std :: getline (, ) пример. Эта версия имеет потенциал для переполнения буфера. –