2013-12-01 3 views
1

У меня есть следующий код, вызывающий ошибку seg. Я пытаюсь открыть файл в основной функции, передать FD в другую функцию, которая будет записывать в этот файл. Во-первых, здесь пропущено кода вызоваОшибка сегментации при использовании fwrite

FILE *rd = fopen("received.txt", "w"); 
    if (rd){ 
    recFile(rd, sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); 
    printf("Done receiving file \n"); 
    } 

Внутри recFile, есть часть, которая выполняет следующие действия:

void recFile(FILE* toWrite, int sockfd, const struct sockaddr *servaddr, socklen_t  serv_addr){ 

while (1) { 
    char packet[PACKSIZE]; 
    //does stuff to fill character array packet 
    if (/*successful*/){ 
     printf("The array is %s", packet); 
     fwrite(packet, 1, strlen(packet), toWrite); 
    } 
    else { 
     //Wait 
    } 
} 

}

Я знаю, что массив символов становится заполненным как это должно быть, потому что оператор printf печатает именно то, что мне нужно. Но функция fwrite вызывает ошибку seg. Я написал следующую тестовую программу манекена, чтобы убедиться, что я понимаю, дескрипторы файлов и FWRITE должным образом, и это работает:

void printTest(FILE *fd, int n){ 
char str[5]; 
strncpy(str, "hello", 5); 
    if (fd){ 
    int i=n; 
     while(i){ 
     printf("i equals %d \n", i); 
     fwrite(str, 1, sizeof(str), fd); 
     i= i-1; 
     } 
    } 
} 
int main(int argc, char *argv[]){ 

FILE *f= fopen("newfile.c", "w"); 
printTest(f, 4); 
} 

Что только сильно упрощенная версия того, что мой код должен делать, и это работает без сбоев сегмента , Почему printf работает, но fwrite вызывает ошибку сегментации?

+0

Использование fwrite выглядит нормально. Я бы предположил, что проблема до этого и развращает что-то. Кроме того, вы проверили, является ли strlen (пакет) Devolus

+1

Мое предположение заключается в том, что пакет не заканчивается \ 0, поэтому вы пишете пропущенный пакетный буфер. –

+0

Ничего, разобрался! Поскольку запись происходит через некоторое время (1), она никогда не вызывала fclose и не выходила из функции, поэтому файл никогда не сохранялся. Спасибо всем, кто прокомментировал это в любом случае! – user3055170

ответ

0

понял это! Поскольку запись происходит через некоторое время (1), она никогда не вызывала fclose и не выходила из функции, поэтому файл никогда не сохранялся. - user3055170

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