Я пытаюсь прочитать файл, используя строки данных, чтобы создать объект.
Текущий файл у меня такой, и код, читающий файл, будет найден ниже.
* 1223 Fake1 Name1 60 70 80 24 89 add1 Male
1224 Fake2 Name2 61 70 81 80 24 add2 Male
1225 Fake3 Name3 63 70 82 80 89 add3 Male
1226 Fake4 Name4 63 70 83 80 88 add4 Male*
Проблема, с которой я столкнулась, заключается в том, что мне нужно помещать разделители в файл, чтобы у человека могло быть несколько имен, а также теперь адрес может содержать несколько строк до разделителя.
Я хотел бы изменить свой файл на это;
*1223 : Fa1 Name1 : 60 : 70 : 80 : 24 :89 : This will be address1 : Male
1224 : Fake2 Name2 : 61 : 70 : 81 : 80 :24 : This will be address2 : Male
1225 : Fake3 Name3 : 63 : 70 : 82 : 80 :89 : This will be address3 : Male
1226 : Fake4 Name4 : 63 : 70 : 83 : 80 :88 : This will be address4 : Male*
Как я могу обновить код ниже, чтобы он мог использовать разделители для создания объекта?
void loadFile(Person people[], int* i)
{
ifstream infile("people2.txt");
if ( !infile.is_open()) {
// The file could not be opened
cout << "Error";
}
else
{
string str, str1, str2, str3, str4;
int x[6];
while(!infile.eof())
{
infile >> str1;
infile >> str2;
inile >> str;
x[0] = stoi(str);
infile >> str;
x[1] = stoi(str);
infile >> str;
x[2] = stoi(str);
infile >> str;
x[3] = stoi(str);
infile >> str;
x[4] = stoi(str);
infile >> str;
x[5] = stoi(str);
infile >> str3;
infile >> str4;
people[*i] = Person( x[0], str2 + " " + str1, x[1], x[2], x[3], x[4], x[5], str3, str4);
(*i)++;
}
infile.close();
}
}
Вы можете использовать std :: getline для чтения файла по строкам, а также для разделения строки на основе указанного разделителя. Например:
#include <string>
#include <fstream>
#include <sstream>
#include <vector>
int main() {
std::ifstream infile("people2.txt");
if (!infile) {
std::cerr << "Could not open file." << std::endl;
return 1;
}
std::string line;
while (std::getline(infile, line)) { // Read file line by line.
std::string field;
std::vector<std::string> separated_fields;
std::istringstream iss_line(line);
while (std::getline(iss_line, field, ':')) { // Split line on the ':' character
separated_fields.push_back(field); // Vector containing each field, i.e. name, address...
}
// Do something with the results
separated_fields[0]; // ID
separated_fields[1]; // Names
separated_fields[2]; // Number
separated_fields[3]; // Number
separated_fields[4]; // Number
separated_fields[5]; // Number
separated_fields[6]; // Number
separated_fields[7]; // Address
separated_fields[6]; // Sex
}
}
Затем вы можете создать свой объект в разделе, помеченном //Do something with the results
либо передав отдельные строки, как у вас в вашем примере, либо передайте вектор конструктору и применив каждое его поле.
inile >> str;
это никогда не скомпилируется