我正在使用javascript读取csv文件并将它们发送到C ++ webserver / backend以将文件上载到服务器。此文件通过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)
那么问题可能不在你认为的地方。
创建文件并将字符串放入其中,但每次换行后都会显示空行。
没有该文件是一个非常好的CSV文件。大多数实现(即使那些允许不同的分隔符和引用字符)同意行分隔符为2个字符"\r\n"
。
所以问题只来自您用来显示文件的工具或您尝试阅读它的方式。
这只是我的意见,但我强烈建议你不要从csv文件中删除'\r'
字符。
我认为正确的方法是将文件作为二进制文件处理。这样你就不会依赖操作系统解释在将'\n'
写入文件时如何转换它。
提供的评论解决了这个问题:我现在只是从字符串中删除每个\r\n
而不是用\n
替换\r
的每一次出现 - 这解决了我的问题。
我试着通过写作重新创建你的文件
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很奇怪。 ;) 编辑:阅读OP的答案,我还建议将它们存储为二进制文件, 如果你所做的只是通过互联网存储和检索文件。