C ++将文件读入结构
C++ reading a file into a struct
我使用 fstreams 打开了一个包含多行的文件。每组连续的 4 行是这样的:第一行是 int,第二和第三行是字符串,第四行是双精度数。这个序列一直持续到 EOF。
我正在尝试将这些行加载到结构数组中:
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
我在这里遇到的问题是,在使用 file >> ...
和 getline(...)
读取 id
和 title
之间,某处引入了换行符向上显示这个怪物的输出...
ID: 1234
Title:
Artist: Never Gonna Give You Up
Price: 0
--------------------
ID: 0
Title:
Artist:
Price: 0
--------------------
该解决方案可能是最基本的解决方案,但主要是因为我无法弄清楚换行符到底发生了什么我无法组合一个短语来推入 google 并执行我的东西在那里,我正处于我一直在研究问题的阶段,基础知识不能正常工作——比如如何处理基本输入流。
我们将不胜感激任何形式的帮助!提前致谢:)
发生这种情况是因为输入流的 >> 运算符只抓取一行的一部分,并不总是抓取行尾的换行符。当随后调用 getline
时,getline
将抓取先前解析的行的其余部分,而不是其后的行。有几种方法可以解决这个问题:您可以在每次读取后从输入流中清除缓冲区,或者您可以简单地从 getline
获取所有输入,然后在您将结果字符串解析为整数或双精度数时需要调用 stoi
或 stod
.
附带说明一下,您不想像现在这样检测文件的结尾。参见 why is eof considered wrong inside a loop condition?
您可以通过添加来解决这个问题:
fflush(file);
每次使用前 getline(file, ...)
。基本上这将在您使用 getline()
函数之前清除输入缓冲区。并且 fflush()
在 cstdio 库中声明。
file >> database[counter].id;
在这种情况下,将读取被解释为 int 的以空格分隔的字符序列。换行符被认为是空格。您现在应该坐在那个换行符上,因此 getline() 将读取 nothing -- 成功 -- 并增加文件位置刚好超过那个。
你最好对每一行使用 getline() ,然后分别解释阅读中的行。例如,读取的第一行可以用后续的 std::stoi() 进行解释,以从字符串中获取整数表示形式。
我使用 fstreams 打开了一个包含多行的文件。每组连续的 4 行是这样的:第一行是 int,第二和第三行是字符串,第四行是双精度数。这个序列一直持续到 EOF。
我正在尝试将这些行加载到结构数组中:
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
我在这里遇到的问题是,在使用 file >> ...
和 getline(...)
读取 id
和 title
之间,某处引入了换行符向上显示这个怪物的输出...
ID: 1234
Title:
Artist: Never Gonna Give You Up
Price: 0
--------------------
ID: 0
Title:
Artist:
Price: 0
--------------------
该解决方案可能是最基本的解决方案,但主要是因为我无法弄清楚换行符到底发生了什么我无法组合一个短语来推入 google 并执行我的东西在那里,我正处于我一直在研究问题的阶段,基础知识不能正常工作——比如如何处理基本输入流。
我们将不胜感激任何形式的帮助!提前致谢:)
发生这种情况是因为输入流的 >> 运算符只抓取一行的一部分,并不总是抓取行尾的换行符。当随后调用 getline
时,getline
将抓取先前解析的行的其余部分,而不是其后的行。有几种方法可以解决这个问题:您可以在每次读取后从输入流中清除缓冲区,或者您可以简单地从 getline
获取所有输入,然后在您将结果字符串解析为整数或双精度数时需要调用 stoi
或 stod
.
附带说明一下,您不想像现在这样检测文件的结尾。参见 why is eof considered wrong inside a loop condition?
您可以通过添加来解决这个问题:
fflush(file);
每次使用前 getline(file, ...)
。基本上这将在您使用 getline()
函数之前清除输入缓冲区。并且 fflush()
在 cstdio 库中声明。
file >> database[counter].id;
在这种情况下,将读取被解释为 int 的以空格分隔的字符序列。换行符被认为是空格。您现在应该坐在那个换行符上,因此 getline() 将读取 nothing -- 成功 -- 并增加文件位置刚好超过那个。
你最好对每一行使用 getline() ,然后分别解释阅读中的行。例如,读取的第一行可以用后续的 std::stoi() 进行解释,以从字符串中获取整数表示形式。