Проблема заключается в том, что c[1]
не будет работать как строка, поскольку она не может содержать завершающего nul
байт, поэтому он должен быть
char c[2] = {0};
, а также c[2]
должны быть int
, как это
int c[2] = {0};
потому что fgetc()
возвращает int
, поэтому ваш код потенциально переполнен c[0]
, но у вас также есть некоторые другие вещи, которые вы можете улучшить.
Вам не нужно c
быть массив, можно просто объявить его как это.
int c;
, а затем использовать fputc();
вместо fprintf()
.
Вы должны проверить, что ни один из вызовов fopen()
не удался, иначе ваша программа вызовет неопределенное поведение из-за разыменования указателя NULL
.
Это надежная версия вашей собственной программы с проблемой вы описали в своем вопросе фиксированной
/* ** Function return value meaning
* -1 cannot open source file
* -2 cannot open destination file
* 0 Success
*/
int File_Copy (char FileSource [], char FileDestination [])
{
int c;
FILE *stream_R;
FILE *stream_W;
stream_R = fopen (FileSource, "r");
if (stream_R == NULL)
return -1;
stream_W = fopen (FileDestination, "w"); //create and write to file
if (stream_W == NULL)
{
fclose (stream_R);
return -2;
}
while ((c = fgetc(stream_R)) != EOF)
fputc (c, stream_W);
fclose (stream_R);
fclose (stream_W);
return 0;
}
[ 'fgetc()'] (HTTP: // port70. net/~ nsz/c/c11/n1570.html # 7.21.7.1) возвращает значение типа 'int'. Преобразование его в 'char' теряет информацию. – pmg