这是我当前的代码,我在网上看到的所有地方都说它应该可以工作。
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
string infile;
string outfile;
int batch1;
int temp1;
int press1;
double dwell1;
int batch2;
cout<<"Enter Input File: "<<endl;
cin>>infile;
cout<<endl<<"Enter Output File: "<<endl;
cin>>outfile;
cout<<endl;
string line;
ifstream myfile (infile);
if (myfile.is_open())
{
while ( getline (myfile,line) )
{
//cout << line << endl<<endl;
myfile>>batch1>>temp1>>press1>>dwell1;
// myfile>>batch2;
}
myfile.close();
cout<<batch1<<" "<<temp1<<" "<<press1<<" "<<dwell1<<" "<<batch2;
}
else
cout << "Unable to open input file";
ofstream file;
file.open (outfile);
if (file.is_open())
{
file << "Writing this to a file.n";
file.close();
}
else
cout<<"Unable to open output file"<<endl;
return 0;
}
现在它输出347 0 0 0 0
我不明白为什么它从第二行开始,为什么接下来的几个变量都是零。我正在读取的文件如下:
123 189 49 4.0
347 160 65 1.5
390 145 75 2.0
456 150 60 2.5
478 170 62 3.0
567 160 78 4.2
非常感谢,我已经被困在这里一段时间了。
我不明白为什么它从第二行开始,为什么接下来的几个变量是零
整行已经从getline()
函数中读入。如果您直接从myfile
中读取更多的值,这些值将从输入流中额外消耗。
将line
放入std::istringstream
中,并从中输入变量:
while ( getline (myfile,line) )
{
std::istringstream iss(line);
//cout << line << endl<<endl;
iss >>batch1>>temp1>>press1>>dwell1;
// iss>>batch2;
cout<<batch1<<" "<<temp1<<" "<<press1<<" "<<dwell1<<" "<<batch2;
}
更新
要存储多个值集(根据输入行(,请创建一个小型数据结构
struct DataRecord {
int batch1;
int temp1;
int press1;
int dwell1;
int batch2;
};
并将所有输入(线(保持在这样的的CCD_ 6中
std::vector<DataRecord> records;
while ( getline (myfile,line) )
{
std::istringstream iss(line);
DataRecord record;
iss >> record.batch1
>> record.temp1
>> record.press1
>> record.dwell1
>> record.batch2;
records.push_back(record);
}
for(std::vector<DataRecord>::iterator it = records.begin();
it != records.end();
++it)
{
cout << it->batch1 << " "
<< it->temp1 << " "
<< it->press1 << " "
<< it->dwell1 << " "
<< it->batch2 << std::endl;
}
有很多方法可以逐行解析。
使用getline((处理它会导致手动解析结果字符串的冲动,要么通过重新创建一个流对象,然后可以使用>>之类的流运算符进行解析,要么使用sscanf或其他任何可以完成这项工作的方法。
但是,由于您已经有了一个输入流(myfile(,因此不需要将一行读取到字符串中并从中重新创建输入流。
换句话说,取代
while ( getline (myfile,line) )
它读取一行并立即用检查结束条件
while (!myfile.eof())
它只检查结束条件可能已经完成了这项工作,因为你仍然在使用逐行读取
myfile>>batch1>>temp1>>press1>>dwell1;
只是每条线由4个元素组成/定义。
下面是一个使用字符串流替换文件输入的简短示例:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
int batch1;
int temp1;
int press1;
double dwell1;
stringstream ss;
ss << "123 189 49 4.0n347 160 65 1.5n390 145 75 2.0";
while (!ss.eof())
{
ss >> batch1 >> temp1 >> press1 >> dwell1;
cout << batch1 << "|" << temp1 << "|" << press1 << "|" << dwell1 << endl;
}
return 0;
}