需要从.txt文件中输入变量的帮助



这是我当前的代码,我在网上看到的所有地方都说它应该可以工作。

#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;
}

相关内容

  • 没有找到相关文章

最新更新