Я пытаюсь использовать strtok для объединения строки, прочитанной в cstring, на отдельные строки. Да, я знаю, что с строковыми объектами это можно сделать намного проще, но мне не разрешено их использовать. Когда этот код выполняется, он отлично работает с первой строкой, затем он продолжает работать только с этой же строкой на каждой итерации цикла. Файл успешно считывается в массив символов 'line', что подтверждается cout ‹* line ‹* endl; Однако strtok и второй цикл while продолжают разделять первую прочитанную строку каждый раз. Каждая строка содержит идентификатор first_name last_name и шесть оценок. Думаю, я просто перепишу его и сделаю разделитель 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++;
}
}
strtok
сломан, и его не следует использовать никогда. Он поддерживает глобальное состояние, что делает невозможным обслуживание любой программы, использующей его. - person James Kanze   schedule 13.02.2013while ( fin.eof() )
неверно, так как пытается использовать результатыfin.getline
без проверки его успешности. - person James Kanze   schedule 13.02.2013std::string
? Если это курс, то вы не должны были видетьchar[]
до тех пор, пока не увиделиstd::string
. - person James Kanze   schedule 13.02.2013