从文本文件C ++中读取和存储数据

时间:2015-10-06 01:46:51

标签: c++ input

我有一个类似于此处发布的问题:

C++: Read from text file and separate into variable

不同之处在于原始帖子的file.txt格式如下:

  • name int int int
  • name int int int

我的文件格式如下:

  • fname lname

  • int int int

  • fname lname

  • int int int

我试图在(第一个和最后一个)中读取名称并将其存储到单个变量中,并将每个int存储到其自己的单独变量中(以供将来计算)。

我尝试过使用与答案类似的东西,但换行符会弄乱我的变量。

作为额外的奖励,我的档案中有随机的空行。

这是我到目前为止的代码

if (myfile.is_open())
{    
    while (getline(myfile, line))
    {
        istringstream iss(line);

        string fname;

        string lname;

        if (line != "")
        {
            iss >> fname >> lname >> x >> y >> z >> a >> b >> c;
            cout << "name: " << fname << endl;
            //iss >> x >> y >> z >> a >> b >> c;
            cout << "x: " << x << "y: " << y << endl;

        }
        else cout << "";
    }
}

4 个答案:

答案 0 :(得分:0)

你需要2行并打破变量读数。

iss >> fname >> lname >> x >> y >> z >> a >> b >> c; //don't know why you have 6 ints when you specified 3, I'll assume 6 is correct

变为

issFirstLine >> fname >> lname;
issSecondLine >> x >> y >> z >> a >> b >> c;

现在有多种方法可以做到这一点。 2个选项是:您可以尝试分别读取2行,只有在有2个非空行时才进行打印,或者您可以使用某种变量来确定您是在名称还是在行上,相应地打印,并在成功输出结束时更改预期类型。

答案 1 :(得分:0)

您可以使用freopen()来读取文件。如果希望输入行之间有多个空行,则没有问题。

freopen("test.txt","r",stdin);
string fname;
string lname;
int x, y,z ,a ,b ,c;
while(cin>>fname){
cin>>lname>> x >> y >> z ;
//your other code
}

答案 2 :(得分:0)

这样的事情应该有用。

#include <stdio.h>

int main(int argc, char** argv) {
    FILE *fin = fopen("in.txt", "r");

    char fname[1024], lname[1024];
    int x, y, z;
    while (fscanf(fin, "%s %s %d %d %d", fname, lname, &x, &y, &z) == 5) {
        printf("%s %s %d %d %d\n", fname, lname, x, y, z);
    }

    return 0;
}

答案 3 :(得分:0)

OP非常接近它会伤害。

我将通过引入一个有助于消除空白行的功能来建议简化:

istream & getNonBlankLine(istream & in,
                           string & line)
{
    while (getline(in, line) && line.length() == 0)
    {
        //does nothing. If the loop didn't exit, line was blank
        // if the loop exited, either we're out of lines or we got a valid line
        // out of lines case is handled by testing the stream state on return 
    }
    return in; // lets us chain and also lets us easily test the state of the stream
}

然后回到手头的工作:

if (myfile.is_open())
{
    string nameline;
    string numberline;
    while (getNonBlankLine(myfile, nameline) &&
           getNonBlankLine(myfile, numberline))
    { // got two non-blank lines and the stream is still good
        //turn lines into streams
        stringstream namess(nameline);
        stringstream numberss(numberline);

        // parse streams 
        if (namess >> fname >> lname && // read in first and last name or return error 
            numberss >> x >> y >> z) // read in x, y, and z or return error
        {
            // do stuff with input
        }
        else
        { //something did not read in correctly. Bad line
            cerr << "invalid input"<< endl; // notify user and abort
            return -1;
        }
    }
}

一个未经请求的更改是检查所有输入的有效性。如果输入不符合,OP的剪切和到目前为止的所有答案都将无声地失败。这必须在第一行有两个名字,在第二行有三个整数。任何其他应该触发无效的输入错误消息和提前退出。我说应该因为我还没有真正测试过这个。