C ++将文件读入结构体

时间:2015-06-08 15:38:52

标签: c++ struct io fstream

使用fstreams我打开了一个包含多行的文件。每个连续4行的集合是这样的:第一行是int,第二行和第三行是字符串,第四行是double。这个序列一直持续到EOF。

我正在尝试将这些行加载到struct数组中:

struct Library {
    int id;
    string title;
    string artist;
    double price;
};

我试图实现将数据加载到结构中的代码是这样的:

const int LIMIT = 10
Library database[LIMIT];
ifstream file;
file.open("list.txt");

if(file) {
    while(!(file.eof()) && counter < LIMIT) {
        file >> database[counter].id;
        getline(file, database[counter].title;
        getline(file, database[counter].artist;
        file >> database[counter].price;
    }
} else {
   ...
}

// Using the following to debug output
for(int i = 0; i < counter; i++) {
    cout << "ID:     " << database[i].id << endl
         << "Title:  " << database[i].title << endl
         << "Artist: " << database[i].artist << endl
         << "Price:  " << database[i].price << endl
         << "-----------------------" << endl;
}

我试图抛出这个东西的文件是

1234
Never Gonna Give You Up
Rick Astley
4.5
42
Thriller
Michael Jackson
32.1

我在这里遇到的问题是,在使用idtitle阅读file >> ...getline(...)之间的某个地方正在引入新行线输出,显示这个怪物......

ID:     1234
Title:  
Artist: Never Gonna Give You Up
Price:  0
--------------------
ID:     0
Title:  
Artist:
Price:  0
--------------------

解决方案可能是最基本的解决方案,但主要是因为我无法弄清楚新行咬合到底发生了什么我无法将一个短语组合成谷歌并在那里做我的东西,而我在我一直在研究问题的阶段,基本知识不能正常工作 - 例如如何处理基本输入流。

任何形式的帮助将不胜感激!在此先感谢:)

3 个答案:

答案 0 :(得分:4)

这是因为&gt;&gt;输入流的运算符仅捕获行的一部分,并不总是在行的末尾获取换行符。当跟随对getline的调用时,getline将获取先前解析的行的其余部分,而不是之后的行。有几种方法可以解决这个问题:您可以在每次读取后清除输入流中的缓冲区,或者只需从getline获取所有输入,并将结果字符串解析为整数或双精度需要拨打stoistod

作为旁注,您不希望以现在的方式检测文件的结尾。见why is eof considered wrong inside a loop condition?

答案 1 :(得分:1)

您可以通过添加以下内容来解决此问题:

fflush(file);

每次使用getline(file, ...)之前。基本上,这将在您使用getline()函数之前清除输入缓冲区。并且在{cstdio库中声明了fflush()

答案 2 :(得分:0)

file >> database[counter].id;
在这种情况下,

将读取以空格分隔的字符序列,并将其解释为int。换行符被视为空格。您现在应该坐在换行符上,因此getline()将成功读取 nothing - 并将文件位置增加到该位置。

最好每行使用getline(),然后分别解读阅读中的行。例如,第一行读取可以使用后续的std :: stoi()来解释,以从字符串中获取整数表示。