2013-03-27 3 views
0

У меня возникли проблемы с моим следующим кодом C:Segfault - fclose/Еореп

int main(void){ 

    FILE* infile = fopen("file","r); 
    FILE* fp = NULL; 

    unsigned char* buffer = malloc(512); 

    while(fread(buffer,512,1,infile) > 0){ //reading a file block by block 

      if(buffer[0] == 0xff){ 
       ... //defining variable "name" 
       if(fp != NULL)fclose(fp); 
       fp = fopen(name,"w+"); 
       fwrite(buffer,512,1,fp); 
      } else if(fp != NULL) { 
        fwrite(buffer,512,1,fp); 
      } 

    } 

} 

кажется, что я не могу FOPEN после fclose, используя тот же указатель, почему? Мне нужен мой указатель, чтобы он оставался доступным повсюду в главном, поэтому я не могу объявить новый в свое время.

EDIT: О, боже, проблема решена. Я, наверное, был очень устал. Я составлял неправильный файл. В любом случае ...

Спасибо, ребята!

+5

Вы не используете «тот же указатель». Вы просто фиксируете возвращаемое значение. Segfault вызван кодом, который вы не разместили здесь. –

+0

Я знаю, что это странно, но если я не освобожу память с помощью flose (fp), sgefault больше не встречается. – superzamp

+1

Пожалуйста, создайте самую маленькую полную программу, которая воссоздает проблему. –

ответ

1

Трудно сказать, почему, поскольку вы не показываете нам весь свой код. Однако повторное открытие файла должно быть довольно простым:

#include <stdio.h> 

int main(void) 
{ 
    FILE* fp = NULL; 
    char name[] = "somefile"; 

    for (;;) 
    { 
    // do something 
    if ((fp = fopen(name, "w+")) == NULL) 
     break; 
    // do something with the file 
    fclose(fp); 
    // do something 
    } 

    return 0; 
} 
+0

Если 'fopen()' возвращает 'NULL', у вас есть ошибка, вероятно, не должна просто прерываться от цикла. –

+0

@ DietrichEpp True. Я просто показываю, что простое повторное открытие просто. –