带有行结尾的C ++字符串,用于存档空行

问题描述 投票:0回答:3

What I am doing:

我正在使用javascript读取csv文件并将它们发送到C ++ webserver / backend以将文件上载到服务器。此文件通过HTTP POST请求作为字符串发送到Web服务器。

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

The problem is:

将字符串放入服务器上新创建的.csv文件时

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

file.close();

创建文件并将字符串放入其中,但每次换行后都会显示空行。在C ++中调试时,该字符串仍然具有\r\n行结尾。

What I have tried:

我试图用\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)

c++ string csv line-endings
3个回答
1
投票

那么问题可能不在你认为的地方。

创建文件并将字符串放入其中,但每次换行后都会显示空行。

没有该文件是一个非常好的CSV文件。大多数实现(即使那些允许不同的分隔符和引用字符)同意行分隔符为2个字符"\r\n"

所以问题只来自您用来显示文件的工具或您尝试阅读它的方式。

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

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


0
投票

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


0
投票

我试着通过写作重新创建你的文件 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的答案,我还建议将它们存储为二进制文件, 如果你所做的只是通过互联网存储和检索文件。

© www.soinside.com 2019 - 2024. All rights reserved.