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

时间:2014-03-21 17:38:03

标签: c++ input

这是我目前的代码,我在网上看到的任何地方都说它应该有用。

#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

非常感谢,我已经被困在这里一段时间了。

2 个答案:

答案 0 :(得分: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;
};

并将所有输入(行)保留在std::vector<>之内:

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;

}

答案 1 :(得分:1)

有许多方法可以逐行解析。

使用getline()接近它会导致手动解析结果字符串的冲动,要么通过重新创建流对象,然后可以使用流运算符(如&gt;&gt;)解析它。或使用sscanf或其他任何可以完成工作的东西。

但是,由于您已经有一个输入流(myfile),因此无需将字符串读入字符串并从中重新创建输入流。

换句话说,替换

while ( getline (myfile,line) )

读取一行并使用

立即检查结束条件
while (!myfile.eof())
只检查结束条件的

可能已经完成了工作,因为您仍在使用

逐行阅读
myfile>>batch1>>temp1>>press1>>dwell1;

只是每一行由4个元素组成/定义。

以下是使用stringstream替换文件输入的简短示例:

#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.0\n347 160 65 1.5\n390 145 75 2.0";

    while (!ss.eof())
    {
        ss >> batch1 >> temp1 >> press1 >> dwell1;
        cout << batch1 << "|" << temp1 << "|" << press1 << "|" << dwell1 << endl;
    }

    return 0;
}