Задать вопрос

Как удалить символ перевода каретки (0x0D) при чтении файлов в linux на C++

Всем привет!

Есть файл, сформированный в windows, соответственно, окончание строки в нем обозначено двумя идущими подряд символами 0x0D 0x0A.
Необходимо считать строки из этого файла в linux. Если организовать чтение таким образом:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;
int main()
{
    ifstream file("file.txt");
    string line;
    std::getline(file, line);
    return 0;
}

то при запуске под linux последний символ в строке line будет 0x0D. Каким образом корректно заставить игнорировать чтение этого символа?

Заранее спасибо!
  • Вопрос задан
  • 7071 просмотр
Подписаться 4 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
@Elsedar
Я бы, пожалуй, не парился и просто проверял наличие в конце строки \r, и, если он присутствует, то удалял бы его через .erase().

Или еще лучше просто сконвертировал бы весь файл.
Ответ написан
Комментировать
turboNOMAD
@turboNOMAD
Посмотрите на вот такую перегруженную версию getline:
basic_istream& getline (char_type* s, streamsize n, char_type delim);
Если в качестве параметра delim указать 0x0D, то этого символа в считываемых строках не будет.
Ответ написан
yourich
@yourich Автор вопроса
В общем, было сделано следущее:
std::getline(file, line);
size_t len = line.length();

if (len && (line.c_str()[len - 1] == 0x0D) )	// linux read
    line.erase(len - 1);

Такой код работает как на windows, так и на linux, при этом одинаково считываются как файлы, строки которых оканчиваются как на 0x0D 0x0A, так и на 0x0A
Всем спасибо!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы