无法编译,因为替换功能使用不当?

时间:2014-12-19 06:35:33

标签: c++ string csv

我在一个文本文件中流式传输,该文件使用半冒号来分隔值。 我想用冒号替换半冒号,然后流式传输到新制作的.csv文件

当前,程序在编译期间运行时没有错误,但是当我指定输出文件名时, 它会创建.csv文件然后崩溃。

我无法在帖子中上传图片,因为我是新会员......

以下是编译时的Visual Studio输出:

BEGIN
1>------ Build started: Project: export, Configuration: Release Win32 ------
1>  export.cpp
1>  Generating code
1>  Finished generating code
1>  export.vcxproj -> J:\Bar\OIL Final\export\Release\export.exe
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
END

这是'胆量'代码:

string file_type = ".csv";                          //  Stores the Export 

文件名扩展名     string file_path ="&#34 ;; //存储

导出文件名和路径     string filename;

bool validateExportFilename()
{
    bool valid_filename = false;                        // Holds the Bool Value which 

维持一个循环,直到找到vaid文件

    while (valid_filename == false)
    {
        std::cout << "\t\tPlease Enter A Name For These Results:\t";
        cin >> filename;

        file_path = export_folder + filename + file_type;

        ifstream check_filename;                        // Define the Input 

文件流 - &gt;使用USER输入的文件名             check_filename.open(FILE_PATH); //打开文件全新 - 全部

内存中的位置(即getline()位置)将被重置。

        if (check_filename.fail())
        {
            t("FILE NAME IS VALID..."); //  TRACE MESSAGE
            valid_filename = true;
        }
        else
        {
            std::cout << "\n\t\t\t[!] ERROR - File Exists. Try again. [!]\n" << endl;   // 

通知用户错误                 std :: cout&lt;&lt; &#34; \ n \ n \吨\吨\吨&#34 ;;

                // Format the pause command's screen output
            system("pause");                                    

                    // Pause to give user the time to find the file
        }
        check_filename.close();
    }
    return 0;
}   

if (inFile.is_open())
{
    while (!inFile.eof())
    {
        string line = "";
        getline(inFile, line);
        line.replace(line.begin(), line.end(), ";", ", ");
        outFile << line << endl;
    }
}

t("End Function - Replace");    //  TRACE MESSAGE

inFile.close();
outFile.close();

return 0;

以下是文本文件数据的示例,我正在尝试流入,并转换为CSV文件:

4/09/2013;10:34:57 AM;4780;1129;63;32;19.9;17.7;13.5;12.6;OK;0;50;4.77;26; 144 
4/09/2013;10:35:11 AM;4546;1117;69;30;19.8;17.7;13.7;12.5;OK;0;50;4.76;26; 143 

这就是我想要流式传输到另一个文件,但是扩展名为.CSV而不是.TXT:

4/09/2013,10:34:57 AM,4780,1129,63,32,19.9,17.7,13.5,12.6,OK,0,50,4.77,26, 144 
4/09/2013,10:35:11 AM,4546,1117,69,30,19.8,17.7,13.7,12.5,OK,0,50,4.76,26, 143 

以下是程序崩溃时调试器输出的内容:

The thread 0x1d5c has exited with code -1073741510 (0xc000013a).
The program '[10012] export.exe' has exited with code -1073741510 (0xc000013a).

Unhandled exception at 0x637B7666 (msvcr120.dll) in export.exe: Fatal program exit requested.

调用堆栈列出:

msvcr120.dll!637b7666() Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for msvcr120.dll]  
[External Code] 
>   export.exe!replaceAndExport() Line 204  C++
    export.exe!wmain() Line 79  C++

在Autos下:

-       inFile  {_Filebuffer={_Set_eback=0x00000000 <NULL> _Set_egptr=0x00000000 <NULL> 

_Pcvt = 0x00000000 ...}} std :: basic_ifstream&gt;     + std :: basic_istream&gt; {_Chcount = 0}

std :: basic_istream&gt;     + std :: basic_ios&gt; {_Mystrbuf = 0x001efb88 {_Set_eback = 0x00000000

_Set_egptr = 0x00000000 _Pcvt = 0x00000000 ...} ...}

std :: basic_ios&gt;     + _Filebuffer {_Set_eback = 0x00000000 _Set_egptr = 0x00000000 _Pcvt = 0x00000000

...} std :: basic_filebuf&gt;      - line&#34;&#34; std :: basic_string,std :: allocator&gt;             [size] 0 unsigned int             [capacity] 15 unsigned int     + [原始视图] 0x001efcd8 {...}

std :: basic_string,std :: allocator&gt; *      - outFile {_Filebuffer = {_ Set_eback = 0x00000000 _Set_egptr = 0x00000000

_Pcvt = 0x00000000 ...}} std :: basic_ofstream&gt;     + std :: basic_ostream&gt; {...}

std :: basic_ostream&gt;     + std :: basic_ios&gt; {_Mystrbuf = 0x001efc34 {_Set_eback = 0x00000000

_Set_egptr = 0x00000000 _Pcvt = 0x00000000 ...} ...}

std :: basic_ios&gt;     + _Filebuffer {_Set_eback = 0x00000000 _Set_egptr = 0x00000000 _Pcvt = 0x00000000

...} std :: basic_filebuf&gt;

我可以看到正在创建.CSV文件,但该文件在0KB时保持为空,在文件

之后一瞬间保持为空

创建,应用程序崩溃。

我觉得我可能需要调整&#34;读取一行,在&#34;中交换逗号。进程所以我不会溢出缓冲区,但

我不是程序员,所以我真的不知道...

1 个答案:

答案 0 :(得分:1)

正如您所指出的那样,问题在于行line.replace(line.begin(), line.end(), ";", ", ");

由于您似乎决心强调您不是程序员这一事实,因此即使您使用错误,我也不会详细说明为什么会编译。相反,我将解释如何使用此函数。虽然它们是此功能的多种变体,但string::replace的主要目的是将一个string的一部分替换为另一个string

简单地说,我可以使用string::replaceHello World更改为Goodbye Cruel World,声明我希望Hello 替换 Goodbye Cruel 1}}。当然,这不仅适用于开头,也适用于字符串的任何部分。

这不是你想要的功能。

您要使用的功能位于名为<algorithm>的{​​{1}}中。 replacereplace类似,不同之处在于您不是替换范围,而是指定旧值(在本例中为string::replace)和新值(在本例中为&#39;:& #39;)然后将它们传递给像这样的函数';'。现在,replace(line.begin(), line.end(), ';', ':');将针对replace的所有实例搜索从line.begin()line.end()的范围,并将其替换为';'

感谢您的阅读。