C++ 如何将特殊引号替换为直接引号C++;

C++ 如何将特殊引号替换为直接引号C++;,c++,xcode,csv,parsing,C++,Xcode,Csv,Parsing,例如,我正在解析的文件包含unicode字符u201d,即“(带重音的引号) < p>替换它?使用C++和STL,我将使用这样的代码,您仍然需要将输出缓冲区保存到文件…..在Linux上测试。< /P> #include <string> #include <stdio.h> #include <stdlib.h> #include <iostream> // load file data char* load_file(const char

例如,我正在解析的文件包含unicode字符u201d,即“(带重音的引号)


<如何用“(直引号)?< /p> < p>替换它?使用C++和STL,我将使用这样的代码,您仍然需要将输出缓冲区保存到文件…..在Linux上测试。< /P>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

// load file data
char* load_file(const char *filename)
{
    FILE *fp;

    fp = fopen(filename, "r");
    if (!fp)
        return NULL;

    size_t size;
    if ((0 != fseek(fp, 0, SEEK_END)) || (-1 == (size = ftell(fp))))
        size = 0;

    // set fp at file start
    fseek(fp, 0, 0);

    char *buffer;
    buffer = (char*) malloc(size);
    if(!buffer)
    {
        fclose (fp);
        return NULL;
    }

    if(size != fread(buffer, 1, size, fp))
    {
        free (buffer);
        buffer = NULL;
    }

    fclose (fp);
    return buffer;
}

// replace string
std::string replace(const std::string& str, const std::string& from, const std::string& to)
{
    if(str.size() < 1)
        return str;

    std::string temp_str(str);

    size_t start_pos = 0;
    while((start_pos = temp_str.find(from, start_pos)) != std::string::npos)
    {
        temp_str.replace(start_pos, from.length(), to);
        start_pos += to.length();
    }

    return temp_str.c_str();
}


int main(int argc, char** argv)
{
    const char* file_name = "test.txt";

    char* file_bytes = load_file(file_name);

    if(file_bytes == nullptr)
        return EXIT_FAILURE;

    std::cout << replace(file_bytes, "”", "\"") << std::endl;
    return EXIT_SUCCESS;
}
#包括
#包括
#包括
#包括
//加载文件数据
char*load_文件(const char*filename)
{
文件*fp;
fp=fopen(文件名,“r”);
如果(!fp)
返回NULL;
大小;
if((0!=fseek(fp,0,SEEK_END))| |(-1==(size=ftell(fp)))
尺寸=0;
//在文件开始时设置fp
fseek(fp,0,0);
字符*缓冲区;
缓冲区=(字符*)malloc(大小);
如果(!缓冲区)
{
fclose(fp);
返回NULL;
}
if(大小!=fread(缓冲区,1,大小,fp))
{
自由(缓冲);
缓冲区=空;
}
fclose(fp);
返回缓冲区;
}
//替换字符串
字符串替换(常量std::string&str,常量std::string&from,常量std::string&to)
{
如果(str.size()<1)
返回str;
std::字符串temp_str(str);
大小\u t开始位置\u位置=0;
while((start_pos=temp_str.find(from,start_pos))!=std::string::npos)
{
临时结构替换(起始位置,从.length()到);
起始位置+=至.length();
}
返回temp_str.c_str();
}
int main(int argc,字符**argv)
{
const char*file_name=“test.txt”;
char*file\u bytes=加载文件(文件名);
if(file_bytes==nullptr)
返回退出失败;

STD::CUT> P>使用C++和STL,我会使用这样的代码,你仍然需要保存到输出缓冲区文件…..在Linux上测试。
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

// load file data
char* load_file(const char *filename)
{
    FILE *fp;

    fp = fopen(filename, "r");
    if (!fp)
        return NULL;

    size_t size;
    if ((0 != fseek(fp, 0, SEEK_END)) || (-1 == (size = ftell(fp))))
        size = 0;

    // set fp at file start
    fseek(fp, 0, 0);

    char *buffer;
    buffer = (char*) malloc(size);
    if(!buffer)
    {
        fclose (fp);
        return NULL;
    }

    if(size != fread(buffer, 1, size, fp))
    {
        free (buffer);
        buffer = NULL;
    }

    fclose (fp);
    return buffer;
}

// replace string
std::string replace(const std::string& str, const std::string& from, const std::string& to)
{
    if(str.size() < 1)
        return str;

    std::string temp_str(str);

    size_t start_pos = 0;
    while((start_pos = temp_str.find(from, start_pos)) != std::string::npos)
    {
        temp_str.replace(start_pos, from.length(), to);
        start_pos += to.length();
    }

    return temp_str.c_str();
}


int main(int argc, char** argv)
{
    const char* file_name = "test.txt";

    char* file_bytes = load_file(file_name);

    if(file_bytes == nullptr)
        return EXIT_FAILURE;

    std::cout << replace(file_bytes, "”", "\"") << std::endl;
    return EXIT_SUCCESS;
}
#包括
#包括
#包括
#包括
//加载文件数据
char*load_文件(const char*filename)
{
文件*fp;
fp=fopen(文件名,“r”);
如果(!fp)
返回NULL;
大小;
if((0!=fseek(fp,0,SEEK_END))| |(-1==(size=ftell(fp)))
尺寸=0;
//在文件开始时设置fp
fseek(fp,0,0);
字符*缓冲区;
缓冲区=(字符*)malloc(大小);
如果(!缓冲区)
{
fclose(fp);
返回NULL;
}
if(大小!=fread(缓冲区,1,大小,fp))
{
自由(缓冲);
缓冲区=空;
}
fclose(fp);
返回缓冲区;
}
//替换字符串
字符串替换(常量std::string&str,常量std::string&from,常量std::string&to)
{
如果(str.size()<1)
返回str;
std::字符串temp_str(str);
大小\u t开始位置\u位置=0;
while((start_pos=temp_str.find(from,start_pos))!=std::string::npos)
{
临时结构替换(起始位置,从.length()到);
起始位置+=至.length();
}
返回temp_str.c_str();
}
int main(int argc,字符**argv)
{
const char*file_name=“test.txt”;
char*file\u bytes=加载文件(文件名);
if(file_bytes==nullptr)
返回退出失败;

std::cout遍历字符串,找到相关的标记并替换为您喜欢的替换项?如果不知道您有什么样的代码来执行此操作,就很难说得更具体-首先有几种不同的方法来编码字符串-宽字符、utf等,这会影响您编写c语言的方式ODE,以及C++中字符串的几种方法(<代码> STD::String ,<代码> CHAR*< /COD>等)这也会影响你实际解决这个问题的方式。迭代字符串,找到相关的标记,并用你喜欢的替换项替换它们?如果不看你有什么样的代码来做这件事,就很难更具体了-首先有几种不同的方法来编码字符串-宽字符、utf等等n,这将影响您编写代码的方式,以及在C++中使用字符串(<代码> STD::String ,<代码> char *>代码>等)的几种方法,这也会影响您如何实际解决这个问题。它对我来说不起作用,构建没有任何错误,但是当我编译时,我得到一个未定义的符号错误。替换(std::_1::basic_string,std:_1::basic_string,std::_1::basic_string)”,引用自main.o ld:未找到架构x86_64的符号clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)看起来您对std::string库有一个不同的实现,您应该回顾一下平台中可用的方法,并编辑行:temp\u str.replace(start\u pos,from.length(),to);它对我不起作用,构建没有任何错误,但是当我编译时,我得到一个未定义的符号错误。架构x86_64的未定义符号:“替换(std::_1::basic_string,std:_1::basic_string,std:_1::basic_string)”,引用自main.o ld:symbol中的:genCSV()找不到架构x86_64 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)。看起来您对std::string库有不同的实现,您应该查看在平台中可用的方法,并编辑行:temp_str.replace(start_pos,from.length(),to);