读取带有分隔C++的文件
Read file with separation in C++
我有一个将文本文件读取到向量的脚本。
#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;
}
}
现在让我们调查一下这里有什么问题。
- 首先,您的名称可以在它们之间包含空格,并且您不能使用运算符输入带有空格
>>
字符串。您必须getline()
函数来获取带有空格的输入字符串。此函数将输入文件的整行输入为字符串。 - 其次,您的其他两个输入是整数或其他原始数据类型,因此您可以使用运算符输入它们
>>
因此。在上面的代码中,这两个输入位于 while 循环内。 - 最后也是最重要的
file.ignore()
.>>
运算符在遇到空格' '
、换行符'n'
字符时终止输入。所以在接受player_info的输入之后。数字 2 输入文件中有一个换行符>>
因此运算符在此处停止,但换行符保留在输入缓冲区中getline()
并且函数对换行符和空格字符非常敏感,因此会产生问题。因此,您必须以某种方式删除或忽略缓冲区的换行符。file.ignore()
为您完成这项工作。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到