我有一个脚本,它将文本文件读入向量。
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <vector>
using namespace std;
struct Items
{
string Name;
int Number1;
double Number2;
};
int main()
{
ifstream file("file4.txt");
vector<Items> player_data;
Items player_info;
while (file >> player_info.Name >> player_info.Number1 >> player_info.Number2) {
player_data.push_back(player_info);
}
for (auto &i : player_data) {
std::cout << i.Name << ", " << i.Number1 << ", " << i.Number2 << endl;
}
}file4.txt包含如下内容:
Wogger Wabbit
2
6.2
Bilbo Baggins
111
81.3
Mary Poppins
29
154.8如何正确地显示数据?我如何才能给出分隔,这是一个线中断('\n')?
发布于 2020-06-02 07:50:29
您的代码有一些问题;这个解决方案可以工作,但它并不优雅。我相信这里的人可以给你或者带你去一个更优雅的地方:)
首先,在打开文件之后,您需要检查它是否已打开。
第二,最好使用std::getline()从文件中读取,因为它得到了整个行。当到达空间时,>>会停止。
另外,尽量不要使用using namespace std
编辑
如果文件未打开,则添加错误打印
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cerrno>
#include <cstring>
using namespace std;
struct Items
{
string Name;
int Number1;
double Number2;
};
int main()
{
ifstream file("text4.text");
if(!file.is_open()) // <- check if file opened correctly
{
std::cout << std::strerror(errno); // <- print the reason why the file didnt open
return 0;
}
vector<Items> player_data;
Items player_info;
std::string line;
while(std::getline(file,line)) // <-- read lines and stop when the file is finished
{
player_info.Name = line;
std::getline(file,line);
player_info.Number1 = stoi(line);
std::getline(file,line);
player_info.Number2 = stod(line);
player_data.push_back(player_info);
}
for (auto &i : player_data) {
std::cout << i.Name << ", " << i.Number1 << ", " << i.Number2 << endl;
}
}发布于 2020-06-02 07:11:43
根据您的描述,我假设您希望逐行打印输出。所以用'\n‘代替逗号:
std::cout << i.Name << "\n" << i.Number1 << "\n" << i.Number2 << endl;
发布于 2020-06-02 08:33:58
你可以用以下方式解决你的问题-
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <vector>
using namespace std;
struct Items {
string Name;
int Number1;
double Number2;
};
int main() {
ifstream file("file4.txt");
vector<Items> player_data;
Items player_info;
while (getline(file,player_info.Name)) {
file>>player_info.Number1>>player_info.Number2;
player_data.push_back(player_info);
file.ignore();
}
file.close();
for (auto &i : player_data) {
cout << i.Name << ", " << i.Number1 << ", " << i.Number2 << endl;
}
}现在让我们调查一下这里的陷阱是什么。
>>运算符获取带有空空间的输入字符串。您必须使用getline()函数才能接受空空格的输入字符串。此函数将输入整行输入文件作为string.>>运算符进行输入。在上面的代码中,这两个输入位于while循环中。file.ignore()。>>运算符在遇到空格' ',换行符'\n'字符时终止输入。因此,在输入player_info.Number2后,输入文件中有一个换行符,所以>>操作符停在这里,但是换行符保留在输入缓冲区中,getline()函数对换行符和空格字符非常敏感,这就产生了一个问题。因此,您必须以某种方式删除或忽略缓冲区的换行符。file.ignore()为你做这份工作。--https://stackoverflow.com/questions/62146584
复制相似问题