2016-04-25 3 views
0

Я создал код для разбиения текстовых файлов, когда он находит слово «NEW DAY», а затем сохранит файл с определенным именем.Разделить текстовый файл на C и дать ему имя

Во-первых, я использовал File_Part1, File_Part2 и т. Д. Однако, я хочу использовать первые 15 символов второй строки файла, который я читаю, как имя сохраненного файла.

Например, вторая строка пишется: ТАМ 2000-03-07T14: 53 ... я хочу использовать только ТАМ 2000-03-07

Проблема заключается в том, что функция Sprintf хорошо работал для «% d», «% c», но не работает для «% s», и у меня нет идеи, почему.

Я пытался напечатать переменную непосредственно перед тем, чтобы увидеть, что Sprintf должен получать и получает именно то, что я хочу ...

Вот код:

int TAM_BUFFER = 75; 
int filecounter=1, linecounter=1; 

char fileoutputname[16]; 

int main(int argc, char *argv[]){ 

char buffer[TAM_BUFFER]; 
char buffer2[15]; 


FILE *arquivo = fopen("Entrada.txt", "r"); 
FILE *saida; 

sprintf(fileoutputname, "file_part%d.txt", filecounter); 
saida = fopen(fileoutputname, "w"); 

if(arquivo != NULL){ 

    while(fgets(buffer, TAM_BUFFER, arquivo)){ 

     if(linecounter==2){ 
     strncpy(buffer2,buffer,14); 
    } 

    if (strncmp(buffer,"NEWDAY",strlen("NEWDAY")) == 0){ 
     fclose(saida); 
     linecounter = 1; 
     filecounter++; 
     printf("%s", buffer2); 
     sprintf(fileoutputname,"%s", buffer2); 
     saida = fopen(fileoutputname, "w"); 
     if (!saida) 
      return 1;  
    } 

    fprintf(saida,"%s\n", buffer); 
    linecounter++; 

    } 

} 

fclose(saida); 
return 0; 

} 
+0

Добавить 'PError();' 'когда saida' является' NULL'. Это может показать сообщение об ошибке. – jdarthenay

+0

Вы также должны 'fclose (arquivo)' в конце вашего 'main()'. (Это не решит вашу проблему, но вы всегда должны закрывать файлы). – jdarthenay

+0

Привет @jdarthenay, спасибо за совет, я действительно забыл закрыть (arquivo). О perror(), ну, он сказал «Нет ошибки». поэтому я думаю, что все в порядке. –

ответ

1

Если источник длиннее, чем количество копируемых символов, функция strncpy не будет добавлять терминатор строки, поэтому buffer2 может не содержать ограничителя строк, а когда вы обрабатываете его как завершенную строку, у вас будет неопределенное поведение.

Решение очень просто: добавьте терминатор вручную.

Как

strncpy(buffer2,buffer,sizeof buffer2 - 1); 
buffer2[sizeof buffer2 - 1] = '\0'; 
+0

Здравствуйте, Joachim, это возможно, однако я не знаю почему, но он не распознает персонажа, который я набираю на клавиатуре. Я имею в виду, что это не сработало, поэтому я попытался добавить «N» в buffer2 [10], и это не было добавлено, вместо этого было добавлено пространство «» между номерами, где должно быть «N». Я думаю, это также происходит, когда я добавляю '\ 0' ... –

+0

Если я использую sprintf (fileoutputname, "% c.txt", * buffer2); это сэкономит с первой буквой второй строки, я имею в виду, буква «Т» Но если я изменить для Sprintf (fileoutputname, «% s.txt», * Буфер2); это просто сбой приложения ... –

+0

@ user3054811 Это потому, что '* buffer2' не является указателем. –

Смежные вопросы