У меня есть базовый c C код с намерением прочитать содержимое файла, открыв файл, прочитав его и закрыв файл. Хотя следующий код компилируется и работает, компилятор clang выдает несколько дополнительных предупреждений, на которые я не смог ответить.
#include <stdio.h>
char* scanFile(FILE *fl, char* ch);
int main(int argc, char const* argv[])
{
FILE *file;
char *ch = "\0";
ch = scanFile(file, ch);
fclose(file);
printf("%s\n", ch);
return 0;
}
char* scanFile(FILE *fl, char* ch)
{
fl = fopen("/tmp/test.txt", "r");
if (fl)
{
while ((ch = getchar()) != EOF) { putchar(ch); }
}
return ch;
}
Когда я пытаюсь скомпилировать свой код, мой лязг высвечивает следующие предупреждения.
clang scanFile scanFile.c
scanFile.c:22:20: warning: incompatible integer to pointer conversion assigning to 'char *'
from 'int' [-Wint-conversion]
while ((ch = getchar()) != EOF) { putchar(ch); }
^ ~~~~~~~~~
scanFile.c:22:33: warning: comparison between pointer and integer ('char *' and 'int')
while ((ch = getchar()) != EOF) { putchar(ch); }
~~~~~~~~~~~~~~~~ ^ ~~~
scanFile.c:22:51: warning: incompatible pointer to integer conversion passing 'char *' to parameter of type 'int' [-Wint-conversion]
while ((ch = getchar()) != EOF) { putchar(ch); }
^~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/stdio.h:172:17: note: passing argument to parameter here
int putchar(int);
^
3 warnings generated.
ld: can't link with a main executable file 'scanFile' for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Однако, поскольку в процессе компиляции отсутствуют какие-либо серьезные ОШИБКИ, при запуске исполняемого файла, сгенерированного в результате моей вышеупомянутой компиляции, на экране появляется следующее (следующий faux-latin это файл, который должен быть прочитан и выведен так же, как в моем C коде.)
Ergo ego senator inimicus, si ita vultis, homini, amicus esse, sicut semper fui, rei publicae debeo.
Quid? si ipsas inimicitias, depono rei publicae causa, quis me tandem iure reprehendet, praesertim cum ego omnium meorum consiliorum atque factorum exempla semper ex summorum hominum consiliis atque factis mihi censuerim petenda.
Eodem tempore etiam Hymetii praeclarae indolis viri negotium est actitatum, cuius hunc novimus esse textum.
Cum Africam pro consule regeret Carthaginiensibus victus inopia iam lassatis, ex horreis
Romano populo destinatis frumentum dedit, pauloque postea cum provenisset segetum copia, integre sine ulla restituit mora.
Et hanc quidem praeter oppida multa duae civitates exornant Seleucia opus Seleuci regis, et Claudiopolis quam deduxit coloniam Claudius Caesar.
Isaura enim antehac nimium potens, olim subversa ut rebellatrix interneciva aegre vestigia claritudinis pristinae monstrat admodum pauca.
[1] 59823 segmentation fault ./scanFile
ПРИМЕЧАНИЕ: НО ЭТО ТАКЖЕ ДАЕТ '59823 ошибка сегментации ./scanfile' ошибка все еще.
ДОПОЛНИТЕЛЬНО: лязг-стена дает;
C clang -Wall scanFile.c
scanFile.c:10:19: warning: variable 'file' is uninitialized when used here [-Wuninitialized]
ch = scanFile(file, ch);
^~~~
scanFile.c:7:15: note: initialize the variable 'file' to silence this warning
FILE *file;
^
= NULL
scanFile.c:22:20: warning: incompatible integer to pointer conversion assigning to 'char *' from 'int' [-Wint-conversion]
while ((ch = getchar()) != EOF) { putchar(ch); }
^ ~~~~~~~~~
scanFile.c:22:33: warning: comparison between pointer and integer ('char *' and 'int')
while ((ch = getchar()) != EOF) { putchar(ch); }
~~~~~~~~~~~~~~~~ ^ ~~~
scanFile.c:22:51: warning: incompatible pointer to integer conversion passing 'char *' to parameter of type 'int' [-Wint-conversion]
while ((ch = getchar()) != EOF) { putchar(ch); }
^~
/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/stdio.h:172:17: note: passing argument to parameter here
int putchar(int);
^
4 warnings generated.