C ++ строка с окончанием строки для файла пустых строк - PullRequest
0 голосов
/ 01 марта 2019

Что я делаю:

Я читаю CSV-файлы с помощью JavaScript и отправляю их на веб-сервер / бэкэнд C ++ для загрузки файлов на сервер.Этот файл отправляется веб-серверу в виде строки через HTTP-запрос POST.

В javascript файлы правильно читаются и отправляются на C ++ с \r\n окончаниями строк.

Проблема заключается в следующем:

При помещении строки во вновь созданный файл .csv на сервере с помощью

std::string data = // the parsed http body string
std::ofstream file;
file.open(UPLOAD_DIR + "\\" + filename);
file << data;

file.close();

Файл создается и строка помещается в него, но с пустыми строками после каждого переноса строки.Строка по-прежнему имеет \r\n окончания строки при отладке в C ++.

Что я пробовал:

Я пытался заменить \r\n окончания только на \n, но пустые строки гдевсе еще там.Удаление разрывов строк полностью, очевидно, просто записывает строку в файл без каких-либо символов новой строки.


Как поместить строку в файл без пустых строк?

Ps: csvстрока выглядит в отладчике C ++ следующим образом: enter image description here

EDIT Вот фрагмент строки:

Time [s];Temperature [C]\r\n0;1150\r\n0.1;1150\r\n0.2;1150\r\n0.3;1150\r\n0.4;1150\r\n0.5;1150\r\n0.6;1150\r\n0.7;1150\r\n0.8;1150\r\n0.9;1150\r\n1;1150\r\n1.1;1150\r\n1.2;1150\r\n1.3;1150\r\n1.4;1150\r\n1.5;1150\r\n1.6;1150\r\n1.7;11

(Iзнаете, CSV с точкой с запятой не соответствует RFC)

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Ну, проблема может быть не там, где вы думаете.

Файл создан и в него вставлена ​​строка, но с пустыми строками после каждого переноса строки.

Нет, файл является очень хорошим CSV-файлом.Большинство реализаций (даже те, которые допускают разные разделители и символы кавычек) соглашаются, что разделитель строк представляет собой 2 символа "\r\n".

Таким образом, проблема возникает только из-за инструмента, который вы используете для отображения файла или способа, которым выпопробуйте прочитать его.

Это только мое мнение, но я настоятельно рекомендую вам не удалять символы '\r' из файла CSV.

Я думаю, что правильным способом будет обработкафайл как бинарный.Таким образом, вы не будете полагаться на интерпретацию ОС того, как '\n' следует преобразовывать при записи в файл.

0 голосов
/ 01 марта 2019

Я попытался воссоздать запись в файл, написав
std::ofstream file("mine.txt"); file << "123\r\nabc\r\n890";
И это действительно дало два разрыва строки.
Запись только file << "123\rabc\r890";
сделала свое дело, а также
file << "123\nabc\n890";
Итак, похоже, что Windows использует оба \ r \ n для перевода строки,
достаточно одного из них для текстовых файлов.
Интересно, когда я пишу file << "123 \rabc \r \n890";
и сделать
std::cout << arr[i] << '\t' << int(arr[i]) << '\n'; в цикле,
Я получил:

1       49
2       50
3       51
        32
        13
a       97
b       98
c       99
        32
        13
        32

        10
8       56
9       57
0       48

(обратите внимание на пустую строку перед 10.)
Windows странно.;)
РЕДАКТИРОВАТЬ: Читая ответ ОП, я бы также предложил сохранить их в виде двоичных файлов,
, если все, что вы делаете, это хранение и извлечение файлов через Интернет.

0 голосов
/ 01 марта 2019

Полученные комментарии решили эту проблему: вместо замены каждого вхождения \r\n на \n я просто удаляю каждый \r из строки - и это решает мою проблему.

...