Я пытаюсь получить только одну конкретную строку из файла, используя 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 к тому количеству, которое у меня есть в определенной строке файла? На данный момент он, кажется, изменяет размеры бесконечно.
Ваш код не будет работать, если до новой строки есть пробелы, и будет бесконечно зацикливаться, когда достигнет конца файла.
Лучше использовать 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)