Я пытаюсь понять, почему использование функции C strtok
не работает должным образом для меня. Вот проблема: У меня есть файл, который содержит два типа информации: заголовки и текстовые описания. Каждая строка в файле является заголовком или частью текстового описания. Заголовок начинается с '>'. Текст описания следует за заголовком и может охватывать несколько строк. В конце текста есть пустая строка, которая отделяет описание от следующего заголовка. Моя цель - написать два отдельных файла: один содержит заголовки на каждой строке, а другой содержит соответствующее описание на отдельной строке. Чтобы реализовать коды на C, я использовал fgets
для чтения файла по одной строке за раз в динамически распределенную память. Чтобы написать текст описания в одной строке, я использовал `strtok, чтобы избавиться от любых новых символов строки в тексте.Последний символ не печатается в файл
Мой код работает правильно для файлов заголовков. Однако для файла описаний я заметил, что последний символ текста не распечатывается в файл, даже если он печатается на стандартный вывод.
FILE *headerFile = fopen("Headers", "w"); //to write headers
FILE *desFile = fopen("Descriptions", "w"); //to write descriptions
FILE *pfile = fopen("Data","r");
if (pfile != NULL)
{
int numOfHeaders =0;
char **data1 = NULL; //an array to hold a header line
char **data2 = NULL; //an array to hold a description line
char line[700] ; //maximum size for the line
while (fgets(line, sizeof line, pfile))
{
if(line[0] =='>') //It is a header
{
data1 = realloc(data1,(numOfHeaders +1)* sizeof(*data1));
data1[numOfHeaders]= malloc(strlen(line)+1);
strcpy(data1[numOfHeaders],line);
fprintf(headerFile, "%s",line);//writes the header
if(numOfHeaders >0)
fprintf(desFile, "\n");//writes a new line in the desc file
numOfHeaders++;
}
//it is not a header and not an empty line
if(line[0] != '>' && strlen(line)>2)
{
data2 = realloc(data2,(numOfHeaders +1)* sizeof(*data2));
data2[numOfHeaders]= malloc(strlen(line)+1);
char *s = strtok(line, "\n ");
strcpy(data2[numOfHeaders],s);
fprintf(desFile, "%s",data2[numOfHeaders]);
printf(desFile, "%s",data2[numOfHeaders]);
}
} //end-while
fclose(desFile);
fclose(headerFile);
fclose(pfile);
printf("There are %d headers in the file.\n",numOfHeaders);
}
'printf (desFile,"% s ", data2 [numOfHeaders]);' - первый параметр кажется неправильным. Должно быть: 'printf ("% s ", data2 [numOfHeaders]);' Typo? –
Возможно, вы захотите рассмотреть возможность использования свободной памяти() в том, что вы malloc() – Mawg
'char * s = strtok (строка," \ n ");' Почему есть пробел после '\ n'? –