C++中的分离文件读取
我有一个脚本,可以将文本文件读入向量C++中的分离文件读取,c++,c++11,C++,C++11,我有一个脚本,可以将文本文件读入向量 #include <iostream> #include <fstream> #include <iomanip> #include <string> #include <vector> using namespace std; struct Items { string Name; int Number1; double Number2; }; int main() {
#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;
}
}
如何正确显示数据?我怎样才能给出分隔符,即换行符“\n”?根据您的描述,我假设您希望逐行打印输出。因此,请使用“\n”而不是逗号:
根据您的描述,我假设您希望逐行打印输出。因此,请使用“\n”而不是逗号:
std::cout您的代码有一些问题;这个解决方案可行,但并不优雅。我相信这里的人可以给你或指引你去一个更优雅的: 首先-打开文件后,需要检查文件是否已打开 第二,最好使用从文件中读取,因为它可以获取整行内容。>>到达空间时停止 另外,尽量不要使用 编辑 添加了文件未打开时的错误打印
#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;
}
}
您的代码有一些问题;这个解决方案可行,但并不优雅。我相信这里的人可以给你或指引你去一个更优雅的: 首先-打开文件后,需要检查文件是否已打开 第二,最好使用从文件中读取,因为它可以获取整行内容。>>到达空间时停止 另外,尽量不要使用 编辑 添加了文件未打开时的错误打印
#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;
}
}
你可以用以下方法解决你的问题-
#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函数才能获取带有空格的输入字符串。此函数将输入文件的整行作为字符串进行输入。
其次,其他两个输入是整数或其他基本数据类型,因此可以使用>>运算符进行输入。在上面的代码中,这两个输入位于while循环内。
最后也是最重要的文件。忽略。>>运算符遇到空格“”、换行符“\n”时终止输入。因此,在输入player_info.Number2后,输入文件中有一个换行符,因此>>运算符停止在此处,但换行符仍保留在输入缓冲区中,getline函数对换行符和空白字符非常敏感,因此会产生问题。因此,您必须以某种方式删除或忽略缓冲区的换行符。file.ignore为您执行此任务。
你可以用以下方法解决你的问题-
#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函数才能获取带有空格的输入字符串。此函数将输入文件的整行作为字符串进行输入。
其次,其他两个输入是整数或其他基本数据类型,因此可以使用>>运算符进行输入。在上面的代码中,这两个输入位于while循环内。
最后也是最重要的文件。忽略。>>运算符遇到空格“”、换行符“\n”时终止输入。因此,在输入player_info.Number2后,输入文件中有一个换行符,因此>>运算符停止在此处,但换行符仍保留在输入缓冲区中,getline函数对换行符和空白字符非常敏感,因此会产生问题。因此,您必须以某种方式删除或忽略缓冲区的换行符。file.ignore为您执行此任务。
你能澄清一下你想要实现什么,以及现在发生了什么吗?我的印象是,您只需要将输出行中的s替换为\n。这似乎有点太简单了,所以我想我是误解了…你能发布一个例子吗?你希望打印什么?我怎样才能正确显示数据。显示的代码以何种方式无法正确显示?我发送了一个打印屏幕:。问题是命令行上没有显示数据。@Gabriel90问题很可能是在读取文件时出现的,因此实际上没有数据可打印。您确定文件已正确打开吗?也许你的名字错了,或者它在另一个文件夹中?你能澄清一下你想要实现什么,以及现在发生了什么吗?我的印象是,您只需要将输出行中的s替换为\n。这似乎有点太简单了,所以我想我是误解了…你能发布一个例子吗?你希望打印什么?我怎样才能正确显示数据。显示的代码以何种方式无法正确显示?我发送了一个打印屏幕:。问题是命令行上没有显示数据。@Gabriel90问题很可能是在读取文件时出现的,因此实际上没有数据可打印。您确定文件已正确打开吗?可能您的名称有误,或者它位于其他文件夹中?我发送了一个打印屏幕:。问题不在这里
ta在命令行上。因为player_数据中没有元素。打印尺寸并查看。当文件>>player\u info.Name>>player\u info.Number1>>player\u info.Number2时,问题就出现了。文件已打开,但读取不正确。修复它,它就会工作。我发送了一个打印屏幕:。问题是没有在命令行上显示数据。因为player_数据中没有元素。打印尺寸并查看。当文件>>player\u info.Name>>player\u info.Number1>>player\u info.Number2时,问题就出现了。文件已打开,但读取不正确。修复它,它就会工作。我可以建议添加一些代码来帮助您发现文件何时无法正确打开吗?您可以打印一个日志行,或者返回一个不同的错误代码。0应该用于成功,所以您可以返回1;指示失败。我可以建议添加一些代码来帮助您发现文件何时无法正确打开吗?您可以打印一个日志行,或者返回一个不同的错误代码。0应该用于成功,所以您可以返回1;表示失败。