Я пытаюсь использовать strtok, чтобы разделить строку, прочитанную в строку, на отдельные строки. Да, я знаю, что с строковыми объектами это сделать гораздо проще, но я не могу их использовать. Когда этот код выполняется, он отлично работает в первой строке, затем он продолжает работать только в той же строке для каждой итерации цикла. Файл успешно считывается в массив символов ‘line’, что подтверждается cout << линия << епсИ; Однако strtok и второй цикл while продолжают разбивать первую строку, считываемую каждый раз. Каждая строка содержит имя, имя и фамилию, имя и фамилию и шесть оценок. Я предполагаю, что я просто перепишу его и получу разделитель getline в пустом пространстве и прочту отдельные строки, но знает ли кто-нибудь, почему strtok объединяет только первую строку на каждой последующей итерации цикла?
это сегмент кода, предположим, что все переменные правильно объявлены в другом месте
while(!fin.eof())
{//while open
fin.getline(line, 40, '\n');
cout << line << endl;
ptr = strtok (line, " ");
while(ptr != NULL)
{
if(c==0)
sprintf(firstname, "%s", ptr);
if(c==1)
sprintf(lastname, "%s", ptr);
if(c==2)
sprintf(id, "%s", ptr);
if(c==3)
sprintf(grade1, "%s", ptr);
if(c==4)
sprintf(grade2, "%s", ptr);
if(c==5)
sprintf(grade3, "%s", ptr);
if(c==6)
sprintf(grade4, "%s", ptr);
if(c==7)
sprintf(grade5, "%s", ptr);
if(c==8)
sprintf(grade6, "%s", ptr);
ptr = strtok (NULL, " ");
if(ptr == NULL)
break;
c++;
}
}
Вы не сбрасываете переменную c
после выхода из внутреннего цикла.
Поскольку @Joachim Pileborg, главная проблема сбрасывается c
, Это может быть более явным, чтобы инициализировать его, прежде чем войти во внутренний цикл c=0;
и добавить и else
для каждого if
кроме последнего.