具有行尾的C ++字符串以归档空行

时间:2019-03-01 13:51:12

标签: c++ string csv line-endings

我在做什么:

我正在使用javascript读取csv文件,并将其发送到C ++网络服务器/后端,以将文件上传到服务器。该文件通过HTTP POST请求以字符串形式发送到Web服务器。

在javascript中,文件已正确读取并以\r\n行结尾发送到C ++。

问题是:

使用以下命令将字符串放入服务器上新创建的.csv文件中时

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

file.close();

已创建文件,并将字符串放入其中,但在每个换行符后均带有空行。使用C ++进行调试时,该字符串仍以\r\n行结尾。

我尝试过的事情:

我尝试仅用\r\n替换\n结尾,但仍然有空行。完全删除换行符显然只是将字符串写入文件,而没有任何换行符。


如何将字符串放入文件中而没有空行?

Ps:csv字符串在C ++调试器中如下所示: enter image description here

编辑 这是字符串的一部分:

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

(我知道,带分号的CSV不符合RFC)

3 个答案:

答案 0 :(得分:1)

好吧,问题可能出在你想像的地方。

  

已创建文件,并将字符串放入其中,但在每个换行符后都带有空行。

没有文件是完美的CSV文件。大多数实现(甚至那些允许使用不同定界符和引号的实现)都同意将行分隔符设为2个字符"\r\n"

因此,问题仅来自用于显示文件的工具或尝试读取文件的方式。

这只是我的意见,但我强烈建议您不要从csv文件中删除'\r'个字符。

我认为正确的方法是将文件处理为二进制文件。这样,您就不必依赖操作系统解释如何将'\n'写入文件时进行转换。

答案 1 :(得分:0)

提供的评论解决了它: 现在,我不再只是用\r\n来代替每次出现的\n,而是从字符串中删除每个\r,这解决了我的问题。

答案 2 :(得分:0)

我试图通过写入来重新创建文件
select total_sales, quantity, total_sales / quantity as average_sale, `name`, `user_id` from ( SELECT SUM(payments.amount) as total_sales, COUNT(payments.id) as quantity, `users`.`name`, `payments`.`user_id` FROM `payments` INNER JOIN `users` on `payments`.`user_id` = `users`.`id` GROUP BY `payments`.`user_id` ) x ORDER BY `total_sales` DESC
确实确实给出了两个换行符。
只写 std::ofstream file("mine.txt"); file << "123\r\nabc\r\n890";
做到了,还有
file << "123\rabc\r890";
因此,尽管Windows将两个\ r \ n都用作换行符,但它似乎出现了,
仅其中之一就足以用于文本文件。
有趣的是,当我写 file << "123\nabc\n890";
并做
file << "123 \rabc \r \n890";循环播放,
我知道了:

std::cout << arr[i] << '\t' << int(arr[i]) << '\n';

(请注意10之前的空白行。)
Windows很奇怪。 ;)
编辑:阅读OP的答案,我也建议将它们存储为二进制文件,
如果您要做的就是通过Internet存储和检索文件。