2013-04-01 2 views
4

Я изучаю C, и я родом из фона Java. Буду признателен, если бы у меня было какое-то руководство. Вот мой код:Как использовать FILE в качестве параметра для функции в C?

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main(void) 
{ 
    char *str = "test text\n"; 
    FILE *fp; 

    fp = fopen("test.txt", "a"); 
    write(fp, str); 
} 

void write(FILE *fp, char *str) 
{ 
    fprintf(fp, "%s", str); 
} 

Когда я пытаюсь скомпилировать, я получаю эту ошибку:

xxxx.c: In function ‘main’: 
xxxx.c:18: warning: passing argument 1 of ‘write’ makes integer from pointer without a cast 
/usr/include/unistd.h:363: note: expected ‘int’ but argument is of type ‘struct FILE *’ 
xxxx.c:18: error: too few arguments to function ‘write’ 
xxxx.c: At top level: 
xxxx.c:21: error: conflicting types for ‘write’ 
/usr/include/unistd.h:363: note: previous declaration of ‘write’ was here 

Любые мысли? Спасибо за ваше время.

+1

Я думаю, что вы вызываете системный вызов ['write()'] (http://linux.die.net/man/2/write). Возможно, включите прототип над 'main()' и еще лучше, выберите имя, не используемое системным вызовом, пока вы на нем. – WhozCraig

+1

Нет ничего плохого в вашей функции, проблема в том, что имя выбрано («write» используется в unistd.h) http://pubs.opengroup.org/onlinepubs/009695399/functions/write.html –

+1

Спасибо всем, жаль, что это была долгая ночь. –

ответ

7

Вам не хватает прототипа функции для вашей функции. Кроме того, write объявлен в unistd.h, поэтому вы получаете первую ошибку. Попробуйте переименовать его в my_write или что-то в этом роде. Вам действительно нужна библиотека stdio.h также как примечание, если вы не планируете использовать другие функции позже. Я добавил проверку на fopen ошибку, а также return 0;, который следует завершить все основные функции в С.

Вот что я хотел бы сделать:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 

void my_write(FILE *fp, char *str) 
{ 
    fprintf(fp, "%s", str); 
} 

int main(void) 
{ 
    char *str = "test text\n"; 
    FILE *fp; 

    fp = fopen("test.txt", "a"); 
    if (fp == NULL) 
    { 
     printf("Couldn't open file\n"); 
     return 1; 
    } 
    my_write(fp, str); 

    fclose(fp); 

    return 0; 
} 
0

См. man 2 write на linux.

#include <unistd.h> 

    ssize_t write(int fd, const void *buf, size_t count); 

Это прототип. Вам нужно передать дескриптор целочисленного файла, а не указатель файла. Если вы хотите, чтобы ваша собственная функция изменила название на foo_write или что-то

0

Там уже системная функция называется write. Просто назовите свою функцию чем-то другим, поместите объявление функции, прежде чем использовать его, и все будет в порядке.

+1

«со мной все будет хорошо» - неправильно. Функция должна быть объявлена ​​перед использованием. –

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