我正在使用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
结尾,但仍然有空行。完全删除换行符显然只是将字符串写入文件,而没有任何换行符。
如何将字符串放入文件中而没有空行?
编辑 这是字符串的一部分:
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)
答案 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存储和检索文件。