Попытка использовать C ++ Peek для получения строки кода из файла

Я пытаюсь получить только одну конкретную строку из файла, используя peek, а затем поместить значения из этой строки в объекты типа данных.

for(int i = 0; i < students.length(); i++)
{
int q = 0;
fin >> name;
students[i].n = name;
while(fin.peek() != '\n')
{
students[i].tests.resize(students[i].tests.length()+1);
fin >> test;
students[i].tests[q] = test;
q++;
}

Мне никогда не объяснили Peek, как бы я изменил это так, чтобы он эффективно изменил размеры студентов [i] .tests к тому количеству, которое у меня есть в определенной строке файла? На данный момент он, кажется, изменяет размеры бесконечно.

0

Решение

Ваш код не будет работать, если до новой строки есть пробелы, и будет бесконечно зацикливаться, когда достигнет конца файла.

Лучше использовать std::istringstream разобрать числа и push_back их на tests vector:

for (int i = 0; i < students.length(); ++i)
{
ASSERT_THROW(fin >> students[i].n, "unable to read student name");
std::string line;
ASSERT_THROW(getline(fin, line), "unexpected failure or EOF in file");
std::istringstream iss(line);
int n;
while (iss >> n)
students[i].tests.push_back(n);
ASSERT_THROW(iss.eof(), "invalid content in '" << line
<< "' after test scores");
}

куда ASSERT_THROW выполняет код при проверке и выдаче ошибок, например,

#define ASSERT_THROW(X, MSG) \
do { \
if (X) break; \
std::ostringstream oss; \
oss << __FILE__ << ':' << __LINE__ << " ASSERT_THROW(" \
<< #X << ") " << MSG; \
throw std::runtime_error(oss.str()); \
} while (false)
0

Другие решения


По вопросам рекламы [email protected]