Я пытаюсь разобрать файл.csv, и мне нужно иметь возможность проверить возврат каретки. Вот тестовый файл.csv с именем sample.csv:
2
3
Как вы заметили, в этом файле есть две строки и один столбец. Теперь я пишу следующий код C++:
ifstream myfile (sample.csv); //Import file
char nextchar;
myfile.get(nextchar);
cout<<nextchar<<'\n';
myfile.get(nextchar);
cout<< nextchar<<" If 0, then that was not a carriage return. If 1, it was. :"<<(nextchar=='\n')<<'\n';
myfile.get(nextchar);
cout<<nextchar<<'\n';
Я ожидаю следующий результат:
2
If 0, then that was not a carriage return. If 1, it was. :1
3
однако я получаю:
2
If 0, then that was not a carriage return. If 1, it was. :0
3
Как это возможно? как я могу проверить возврат каретки?
Это может быть пара символов CR + LF. В любом случае вы можете вывести код этого персонажа самостоятельно. Почему ты не сделал это? Также вы можете применить стандартную функцию std::isspace
decalred в заголовке <cctype>
Я предлагаю использовать стандартную функцию std::getline
для чтения целой строки вместо использования get.
В предположениях есть много вещей, которые могут пойти не так: поведение ОС, текстовый редактор, используемый для записи образца файла, нежелательное дополнительное пространство или вкладка в конце строки, а ios_base::openmode
используется для открытия файла, а также все возможные комбинации между ними...
Сначала введите эту строку, чтобы увидеть, что вы на самом деле читаете: 0x0d или 0x0a? или что-то еще?
cout << "Char read: 0x0"<< std::hex << (int)nextchar<<"\n";
cout << "If 0 ... // Existing line
Вы также можете заменить свой образец следующим. Он открывает файл в двоичном режиме и отображает в шестнадцатеричном порядке символы в файле:
ifstream myfile ("sample.csv", ifstream::binary); //Import file
while (myfile.good() ) {
char nextchar;
myfile.get(nextchar);
if (myfile.good())
cout << "0x0"<< std::hex << (int)nextchar
<< " " << (isprint(nextchar)? nextchar:'?') <<"\n";
}
Если вторая и третья строки равны 0x0d и 0x0a, вы точно знаете, что ваш текстовый редактор поставил дополнительный CR.
Затем вы можете удалить ifstream::binary
код в приведенном выше коде. Обычно вы должны иметь, как вы указали только 0x0a во второй строке. Если это не так, то вам следует исследовать, изменился ли режим openmode по умолчанию.
Кстати, я скомпилировал ваш исходный код под окнами и подготовил образец файла с помощью блокнота, запустил программу и получил... чего вы ожидали! Затем я переделал тест со следующей модификацией и, наконец, получил то, что получил.
Удачи !
getline()
?