读取带有分隔C++的文件

Read file with separation in C++

本文关键字:文件 C++ 分隔 读取      更新时间:2023-10-16

我有一个将文本文件读取到向量的脚本。

#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'(?

你的代码有一些问题;这个解决方案有效,但它并不优雅。我相信这里的人可以给你或引导你到一个更优雅的:)

首先 - 打开文件后,您需要检查它是否打开

其次 - 最好使用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;
}
}

根据您的描述,我假设您要逐行打印输出。因此,请使用""而不是逗号:

std::cout << i.Name << "n" << i.Number1 << "n" << 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;
}
}

现在让我们调查一下这里有什么问题。

  1. 首先,您的名称可以在它们之间包含空格,并且您不能使用运算符输入带有空格>>字符串。您必须getline()函数来获取带有空格的输入字符串。此函数将输入文件的整行输入为字符串。
  2. 其次,您的其他两个输入是整数或其他原始数据类型,因此您可以使用运算符输入它们>>因此。在上面的代码中,这两个输入位于 while 循环内。
  3. 最后也是最重要的file.ignore().>>运算符在遇到空格' '、换行符'n'字符时终止输入。所以在接受player_info的输入之后。数字 2 输入文件中有一个换行符>>因此运算符在此处停止,但换行符保留在输入缓冲区中getline()并且函数对换行符和空格字符非常敏感,因此会产生问题。因此,您必须以某种方式删除或忽略缓冲区的换行符。file.ignore()为您完成这项工作。