Lendo arquivo de texto delimitado por vírgula na matriz
Eu estou tentando escrever um programa em C ++ que emula um sistema de matrícula da faculdade, onde o aluno digita seu ID e o programa pesquisa um arquivo de texto por informações e carrega uma estrutura com base no arquivo de texto. Cheguei a um ponto em que estou tendo problemas para obter os cursos inscritos na matriz da estrutura. Usando a função getline, usando ',' como delim também passará pela próxima linha até a próxima vírgula. Qual seria o algoritmo correto para isso?
Esta é a configuração do arquivo que contémfalso informação do aluno:
918273645, Steve, Albright, ITCS2530, MATH210, ENG140123456789, Kim, Murphy, ITCS2530, MATH101213456789, Decano, Bowers, ITCS2530, ENG140219834765, Jerry, Clark, MGMT201, MATH210(Marcadores adicionados para o layout; não estão no arquivo)
Por exemplo, o usuário digita "123456789" para seu ID e as informações de Kim Murphy são lidas. Após a primeira iteração de getline, "ITCS2530" é lido e colocado na variável e, em seguida, carregado na estrutura; não tem problema aí. No entanto, o último curso da lista possui o caractere de nova linha antes da próxima vírgula; portanto, a próxima iteração lê "MATH101 / nl213456789" e coloca a cadeia inteira na variável e tenta carregá-la na estrutura.
A primeira coluna é o ID, depois o nome, o sobrenome e os cursos atualmente matriculados. Observe que o número de cursos inscritos pode variar.
Aqui está o código no qual estou trabalhando atualmente:
student login()
{
string ID;
student newStudent;
string enrolled;
int i = 0;
while (true)
{
cout << "Enter Student ID: ";
cin >> newStudent.ID;
cout << endl;
if (newStudent.ID.length() == 9)
break;
else
cout << "That ID is invalid - IDs are 9 digits" << endl;
}
ifstream inFile;
ofstream outFile;
inFile.open("registration.txt");
if (inFile.is_open())
//Check if file is open
{
while (!inFile.eof())
//While not at end of file
{
getline(inFile, ID, ',');
//Search for ID
if (ID == newStudent.ID)
{
getline(inFile, newStudent.fName, ',');
//Assign fName and lName
getline(inFile, newStudent.lName, ',');
while (enrolled != "\n")
{
getline(inFile, enrolled, ',');
if (enrolled == "\n")
{
cout << "Not currently enrolled in a class." << endl;
}
else
{
newStudent.courses[i] = enrolled;
i++;
}
}
cout << newStudent.lName << ", Welcome to the MCC Enrollment System!" << endl;
for (i = 0; i <= NUM_OF_COURSES; i++)
{
cout << "Enrolled courses: " << newStudent.courses[i] << endl;
}
cout << endl;
break;
//Stops searching
}
else
//Ignores rest of line - used to skip to the next line
{
getline(inFile, ID, '\n');
}
if (inFile.eof())
//If ID was not found
{
inFile.close();
cout << "Enter First Name: ";
//Begin entry of new student
cin >> newStudent.fName;
cout << endl;
cout << "Enter Last Name: ";
cin >> newStudent.lName;
cout << endl;
outFile.open("registration.txt", ios::app);
if (outFile.is_open())
{
outFile << newStudent.ID << "," << newStudent.fName << "," << newStudent.lName << "\n";
}
}
}
}
return newStudent;
}
Agradecemos antecipadamente por qualquer ajuda.