Вы можете прочитать файл построчно, используя getline()
и проверить возвращаемое значение, чтобы узнать, достиг ли вы конца файла или нет.
Я сделал простой пример, который читает все данныеиз файла и загрузите их в «список студентов».
Вот как вы можете это сделать:
файл данных
name:Bob
sex:Male
age:18
name:Alice
sex:female
age:16
код C ++
#include <iostream>
#include <fstream>
#include <vector>
struct Student
{
std::string name;
std::string sex;
std::string age;
void clear()
{
name.clear();
sex.clear();
age.clear();
}
};
std::pair <std::string, std::string> breakdown(const std::string & line);
int main()
{
std::string data_file("../tmp_test/data.txt");
std::vector <Student> students;
std::ifstream in_s(data_file);
if(in_s)
{
std::string line;
Student current;
while(getline(in_s, line))
{
std::pair <std::string, std::string> pair = breakdown(line);
if(pair.first == "name") // first field
{
current.name = pair.second;
}
else if(pair.first == "sex")
{
current.age = pair.second;
}
else if(pair.first == "age") // last field
{
current.sex = pair.second;
students.push_back(current);
current.clear(); // Not necessary
}
else
std::cout << "Info: Unknown field encountered !" << std::endl;
}
in_s.close();
}
else
std::cout << ("Error: Could not open file: " + data_file) << std::endl;
// Do what you want with the loaded data
for(Student s : students)
{
std::cout << "Name: " << s.name << "\nSex: " << s.sex << "\nAge: " << s.age << "\n";
std::cout << std::endl;
}
return 0;
}
std::pair <std::string, std::string> breakdown(const std::string & line)
{
bool found(false);
unsigned int i;
for(i = 0; !found && (i < line.length()); ++i)
{
if(line[i] == ':')
{
found = true;
--i;
}
}
if(found)
return std::make_pair<std::string, std::string>(line.substr(0, i), line.substr(i+1, line.size()-i));
else
return std::make_pair<std::string, std::string>("", "");
}
выход
Имя: БобПол: 18Возраст: мужской
Имя: АлисаПол: 16Возраст: женщина
Это хорошо сработало для меня.Конечно, я не справился, если файл данных поврежден, но дело не в этом.Я попытался сделать это как можно проще, просто чтобы показать, как это можно сделать.
Надеюсь, это поможет.