LINUX.ORG.RU

fopen()


0

0

Есть кусок кода:
#include <stdio.h>
....
int main( int argc, char **argv ) {
....
FILE *fptr;

initLog( fptr ); /* создаем поток в файл */
....
writeLog( fptr, "SOme teXt" ); /* пишем в конец фйла */
....
closeLog( fptr ); /* закрываем поток */

return 0;
}
...
void initLog( FILE *fl ) {

fl = fopen( "someF.log", "a" ); /* пытаемся открыть файл */
if( file == NULL ) { /* если облом.. */
printf( "Cannot open %s.\n", "someF.log" ); /* пишем еррор */
exit( EXIT_FAILED ); /* завершаем прогу */
}

return;
}

void writeLog( FILE *fptr, const char *str ) {
fprintf( fptr, "Log: %s\n", str ); /* пишем в файл строку */

return;
}
...
Файл успешно создается и откравается, но, почему-то при передаче указателя fptr в ф-ию writeLog() возникает segmentation fault. Если
в main ф-ии ф-ию initLog(...) заменить просто на fptr = fopen(...);...
, то все нормально работает. Вопрос как раз в том, почему возникает
этот сег фаулт в первом случае?

glib 1.2.10, gcc 3.3.3


ваша void initLog( FILE *fl ) могла бы с тем
же успехом быть initLog(void).

переменная FILE *fptr в main() не меняется и
показывает в "случайную память".

idle ★★★★★
()

[keiko@localhost tmp]$ gcc -o 16 16.c
[keiko@localhost tmp]$ ./16
[keiko@localhost tmp]$ cat someF.log
Log: SOme teXt

[keiko@localhost tmp]$ cat 16.c
#include <stdio.h>
#include <stdlib.h>

void writeLog(FILE *fptr, const char *str);
void initLog(FILE **fl);
void closeLog(FILE *fp);

int main(int argc, char **argv)
{
    FILE *fptr;

    initLog(&fptr);
    writeLog(fptr, "SOme teXt" );
    closeLog(fptr);

    return 0;
}

void initLog(FILE **fl)
{
    *fl = fopen("someF.log", "a");

    if(*fl == NULL)
    {
        printf( "Cannot open %s.\n", "someF.log" );
        exit(EXIT_FAILURE);
    }
}

void writeLog( FILE *fptr, const char *str )
{
    fprintf(fptr, "Log: %s\n", str);
}

void closeLog(FILE *fp)
{
    fclose(fp);
}

--------------------------------------

P.S. почитай хоть книжку по Си :)

Keiko
()
Ответ на: комментарий от Keiko

Гениально! Спасибо! Это то что нужно.

tetSU
() автор топика
Ответ на: комментарий от Keiko

По поводу указателей, это ты прав надо бы повторить!

tetSU
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.