我在一个文本文件中流式传输,该文件使用半冒号来分隔值。 我想用冒号替换半冒号,然后流式传输到新制作的.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;中交换逗号。进程所以我不会溢出缓冲区,但
我不是程序员,所以我真的不知道...
答案 0 :(得分:1)
正如您所指出的那样,问题在于行line.replace(line.begin(), line.end(), ";", ", ");
由于您似乎决心强调您不是程序员这一事实,因此即使您使用错误,我也不会详细说明为什么会编译。相反,我将解释如何使用此函数。虽然它们是此功能的多种变体,但string::replace
的主要目的是将一个string
的一部分替换为另一个string
。
简单地说,我可以使用string::replace
将Hello World
更改为Goodbye Cruel World
,声明我希望Hello
替换 Goodbye Cruel
1}}。当然,这不仅适用于开头,也适用于字符串的任何部分。
这不是你想要的功能。
您要使用的功能位于名为<algorithm>
的{{1}}中。 replace
与replace
类似,不同之处在于您不是替换范围,而是指定旧值(在本例中为string::replace
)和新值(在本例中为&#39;:& #39;)然后将它们传递给像这样的函数';'
。现在,replace(line.begin(), line.end(), ';', ':');
将针对replace
的所有实例搜索从line.begin()
到line.end()
的范围,并将其替换为';'
。
感谢您的阅读。