C++ 使用C+;从非指定符号中清除CSV文件+;

C++ 使用C+;从非指定符号中清除CSV文件+;,c++,csv,ifstream,boost,C++,Csv,Ifstream,Boost,我正在尝试使用简单的C++代码将CSV文件转换为TXT文件,如下所示: std::ofstream txtFile(strFileName, std::ofstream::out | std::ofstream::app); std::string strLine; std::ifstream csvFile(strCSVDir); while (std::getline(csvFile, strLine)) { std::string subString; std::stri

我正在尝试使用简单的C++代码将CSV文件转换为TXT文件,如下所示:

std::ofstream txtFile(strFileName, std::ofstream::out | std::ofstream::app);
std::string strLine;
std::ifstream csvFile(strCSVDir);

while (std::getline(csvFile, strLine))
{
    std::string subString;
    std::stringstream s(strLine);

    while (std::getline(s, subString, ';'))
    {
        txtFile << subString << "\t";
    }

    txtFile << "\n";
}

txtFile.close();
csvFile.close();
std::ofstream txtFile(strFileName,std::ofstream::out | std::ofstream::app);
std::字符串strLine;
std::ifstream csvFile(strCSVDir);
while(std::getline(csvFile,strLine))
{
std::字符串子字符串;
std::stringstreams(strLine);
while(std::getline(s,子字符串“;”))
{

txtFile只读取整个文件,然后替换并最终保存可能会更容易

从您的代码片段开始:

std::stringstream sstr;
sstr << csvFile.rdbuf();
std::string buffer = sstr.str();
boost::replace_all(buffer, ";", "");
txtFile << buffer;
std::stringstream sstr;

sstr@DimChtz它没有帮助:(如果CSV文件中有一个
0x1a
,那么CSV文件中就有一个
0x1a
。“如何避免这种情况”在很大程度上取决于“正确的”对这种情况的反应是-,这同样取决于CSV文件是什么。该字段可能是一个故意使用十六进制编码的数值。“它是如何进入这个CSV文件的,我不知道”现在是你问题的关键——我们也不知道。让我们来看看。你从哪里得到这个CSV文件,有关于它的内容的文档吗?有人可以问吗?不要只是假设忽略这个值是安全的。@DevSolar不,我肯定可以忽略这个值,因为它位于cs中逗号分隔行的那个部分可以忽略的v文件。它没有任何语义负载。但是它不允许我从这个文件中读取其他重要数据。整个文件可以包含超过1000000行数据,只有1到5行可以有这样的符号。啊,我现在明白了。这里的问题是Windows,特别是,在以文本打开的文件中解释值
0x1a
模式表示“文件结束”。这里的一个解决方案是以二进制模式打开文件。请参阅duplicate。@DevSolar是的,这就是我需要的!谢谢!如果我使用这行代码:std::stringstream sstr=csvFile.rdbuf();则会出现错误“不存在可从…转换的可sutable构造函数”我使用VS2012 C++编译程序。BTW,你忘了;在这行中:@brightside90抱歉,现在应该修复这是一个很好的方法,但如果我使用它,那么std::string缓冲区仍然只包含文件的这一部分,直到arrow@brightside90然后,您的问题似乎只是读取文件-您可以尝试更原始的方法来读取它-fopen/fread或内存映射文件