Как проверить на пустое пространство C ++:

0

Я пытаюсь разобрать файл.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

Как это возможно? как я могу проверить возврат каретки?

  • 2
    Вы пробовали getline() ?
  • 4
    на платформе Win существует возможность '\ r', так как они используют \ r \ n для перевода строки.
Показать ещё 7 комментариев
Теги:
csv

2 ответа

3
Лучший ответ

Это может быть пара символов CR + LF. В любом случае вы можете вывести код этого персонажа самостоятельно. Почему ты не сделал это? Также вы можете применить стандартную функцию std::isspace decalred в заголовке <cctype>

Я предлагаю использовать стандартную функцию std::getline для чтения целой строки вместо использования get.

  • 0
    так (nextchar == '\ n') должно быть вместо (nextchar == '\ r \ n')?
  • 0
    @ user3713167 Я ясно написал, что вместо одного символа '\ n' может быть два символа: '\ r' и '\ n'
Показать ещё 4 комментария
1

В предположениях есть много вещей, которые могут пойти не так: поведение ОС, текстовый редактор, используемый для записи образца файла, нежелательное дополнительное пространство или вкладка в конце строки, а 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 по умолчанию.

Кстати, я скомпилировал ваш исходный код под окнами и подготовил образец файла с помощью блокнота, запустил программу и получил... чего вы ожидали! Затем я переделал тест со следующей модификацией и, наконец, получил то, что получил.

Удачи !

Ещё вопросы

Сообщество Overcoder
Наверх
Меню