Вы получаете -1
, потому что getw()
читает следующее слово из потока (размер слова равен размеру int
и может варьироваться от машины к машине), но в вашем случае при попытке при чтении слова из файла встречается EOF
, и для конца потока устанавливается индикатор конца файла, а getw()
возвращает EOF
. Обратите внимание, что EOF
является макросом, который расширяется до целочисленного константного выражения с типом int
и зависящим от реализации отрицательным значением, но очень часто -1
.
Вы должны использовать putw()
для записи файла, если вы хотите использовать getw()
для чтения файла.
Чтобы показать разницу в файле при использовании putc()
и putw()
для записи файла:
При использовании putc()
:
putc('A',fp);
проверить размер файла:
# ls -lh first.txt
-rw-r--r-- 1 <owner> <group> 1B May 11 18:02 first.txt
^
|
size: 1 byte
При использовании putw()
:
putw('A', fp); // the first parameter type of putw() is int and the character will implicitly promoted to int
проверить размер файла:
# ls -lh first.txt
-rw-r--r-- 1 <owner> <group> 4B May 11 18:00 first.txt
^
|
size: 4 bytes
При использовании putw()
:
#include <stdio.h>
int main(void) {
FILE *fp;
fp = fopen("first.txt", "w");
if (fp == NULL) {
fprintf (stderr, "Failed to open file for write");
return -1;
}
putw('A', fp); // add the error handling for putw()
fclose(fp);
fp = fopen("first.txt", "r");
if (fp == NULL) {
fprintf (stderr, "Failed to open file for read");
return -1;
}
int x = getw(fp);
if (feof(fp)) {
printf ("End of file reached\n");
}
else if (ferror(fp)) {
printf ("Error occurred\n");
}
else {
printf ("%d\n", x);
}
return 0;
}
Выход:
# ./a.out
65