C++ C++;将输入文件行解析为对象数组
我使用过C#和Java,因此我习惯于打开一个输入文件并一直读到文件流的末尾,同时在每行使用某种C++ C++;将输入文件行解析为对象数组,c++,parsing,io,text-files,C++,Parsing,Io,Text Files,我使用过C#和Java,因此我习惯于打开一个输入文件并一直读到文件流的末尾,同时在每行使用某种。拆分,使用分隔符作为制表符、逗号等,以获取单个值或提取每个值的特定字符数。我最近开始使用C++类,到目前为止还没有任何问题,因为它们大多使用控制台输入/输出,但是我发现从文件中提取数据相当困难: struct Student{ string _fullName[50]; int _grade; float _avg; }; int main(){ Student s
。拆分,使用分隔符作为制表符、逗号等,以获取单个值或提取每个值的特定字符数。我最近开始使用C++类,到目前为止还没有任何问题,因为它们大多使用控制台输入/输出,但是我发现从文件中提取数据相当困难:
struct Student{
string _fullName[50];
int _grade;
float _avg;
};
int main(){
Student students[30];
ifstream inputFile;
inputFile.open("file.txt");
if (inputFile.is_open()){
int i = 0;
char data[100];
while (inputFile.getline(data, 100)){
//need to split the data by \t and properly convert it into an int/string/float where needed
}
}
system("pause");
return 0;
}
我考虑过将getline分隔符更改为\t,并以这种方式设置每个值(即,在设置3个属性后将I重置为0),但如果其中一行缺少值,这将不起作用。这在这个小任务中并不重要,但我希望能正确有效地完成这项任务。提取每行数据并将其正确解析为适当的数据类型的最有效方法是什么
注意:此时我不应该使用向量或算法。我建议。您已经在使用标准流,所以我认为它不会偏离主题(如果是,看起来您应该编写自己的字符串拆分器)stringstream
的工作原理与ifstream
完全相同,但它从内存缓冲区而不是文件中读取:
#include <sstream>
// ...
char data[100];
while (inputFile.getline(data, 100)){
std::stringstream lineStream(data);
while (lineStream >> data) {
// now you have a token (space-delimeted) in 'data'
}
}
#包括
// ...
字符数据[100];
while(inputFile.getline(数据,100)){
std::stringstream lineStream(数据);
while(lineStream>>数据){
//现在您在“数据”中有了一个令牌(空间已删除)
}
}
你也可以任意的分隔符,用<代码> GETLION> /Cord>
>“我不应该在这个时候使用向量或算法”听起来好像你有一个相信C++类应该从C开始而不是C++的老师。真可惜。这并不是C++应该如何教的。更多信息:最好使用
std::string
而不是char data[100]
:getline(inputFile,str)
@DmitriyZapevalov是的,绝对-std::string
比手动内存管理好。我没有注意到原来的问题中已经有一个字符串
。我用字符串数据
替换了字符数据[100]
,但是,我是否应该创建另一个变量,如string temp
,并用lineStream>>temp替换lineStream>>data
,以便读取数据,因为数据存储了整行数据?我这样做了,它似乎起了作用,但我想确保我没有误解您的示例。@Dinerdo不需要额外的变量-stringstream将数据复制到其内部缓冲区,然后您可以重新使用存储行的变量(如果需要)。是否仅用空格分隔?没有其他可以,即使只是标签?