嘿,伙计们,我真的想不出标题里的这个错误是什么,就这样吧。
我正在开始一项任务,在那里我必须读取文件的内容,执行一些计算,并将内容+新的计算写入文件。
我编写了在文件中读取的代码,并立即将其写入输出文件,以测试读取是否正确。当我这样做时,我看到流将我的“文件名”字符串(用于向用户询问要打开的文件的名称)随机地写入文件中,代码中没有提到它。
这是我的代码:
#include <string>
#include <fstream>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
char filename[256] = "";
char currentLine[256] = "";
cout << "Please enter the name of the input file: " << endl;
cin.getline(filename,256);
vector <string> storage;//disregard for now
ifstream infile;
infile.open(filename);
string outputFile = ".output";
outputFile = filename + outputFile;
ofstream outfile(outputFile.c_str());
string line = "";
while(!infile.eof())
{
infile.read(currentLine, 256);
line = currentLine;
storage.push_back(line); //disregard for now
outfile << line; //testing to see if it read properly
}
} 以下是输入的文本:
1034蓝色电动浮雕机5 1026
1039绿色电动浮筒10 1026
1054蓝色电除尘器(镁涂层)7 2000
1069 JELLO锤子V2 111 12
1050钟消声器0 50
1090蛇油34 150
1070 MECHAGODZILLA服装(粉红)1500
1090 REFROBULATOR 3 9999
1091 REFROBULATOR灌装(5包)1 4999
1092 REFROBULATOR灌装(10包)1 8999
二零零三年财务今日(三月)4 5
今日(APR) 9 5
二00五年五月二日
3102 FROBULATOR客户保修2年3 199
3103 FROBULATOR客户保修3YR 3 299
这是输出文本:
1034蓝色电动浮雕机5 1026 1039绿色电动浮筒10 1026 1054蓝色电除尘器(镁涂层)7 2000 1069 JELLO锤子V2 111 12 1050钟消声器0 50 1090蛇油34 150 1070 MECHAGODZILLA服装(粉红)1500 1090 Rinvoice.txtEFROBULATOR 3 9999 1091 REFROBULATOR灌装(5包)1 4999 1092 REFROBULATOR灌装(10包)1 8999 二零零三年财务今日(三月)4 5 今日(APR) 9 5 二00五年五月二日 3102 FROBULATOR客户保修2年3 199 3103 invoice.txtFROBULATOR客户保修3YR 3299 填(5包)1 4999 1092 REFROBULATOR灌装(10包)1 8999 二零零三年财务今日(三月)4 5 今日(APR) 9 5 二00五年五月二日 3102 FROBULATOR客户保修2年3 199 3103 invoice.txt
如您所见,"invoice.txt“不应该出现在输出中。现在我错过了什么?
发布于 2010-01-17 21:14:52
逐行读取文件的正确方法是:
string line;
while( getline( file, line ) ) {
// do something with line
}关于为什么会这样,您可能想看看我的这篇博客文章。
发布于 2010-01-17 21:18:27
我想你的问题是:
infile.read(currentLine, 256);因为我注意到朗读
是一个未格式化的输入函数,所提取的内容不作为c-字符串格式存储,因此在字符序列的末尾追加无结束空字符。
所以当你去复制currentLine的时候,拷贝就会从末端走到内存中的任何东西,也就是filename。
https://stackoverflow.com/questions/2082664
复制相似问题