我试图通过使用unistd中的read函数来获取文件中第一个字符的值,并且我遇到了一个奇怪的行为问题:
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
int main() {
char uselessTable[600];
int fdInput;
int firstChar;
if ((fdInput = open("file.txt", O_RDONLY)) == -1) {
perror("file");
_exit(1);
}
read(fdInput, &firstChar, 1);
printf("Taille du nom de fichier : %d\n", firstChar); // prints 32609
if (close(fdInput) == -1) {
perror("close");
_exit(2);
}
}
该文件包含字符串abc,因此它应该打印数字97,但它不会,除非我删除表uselessTable,即使它没有在此程序中使用。
将表的大小更改为500,删除它,在firstChar之后创建它或将int更改为first firstChar似乎解决了问题,但我不明白为什么。
答案 0 :(得分:1)
让我们逐步完成此步骤。首先,创建一个局部变量firstChar
,它是int
而不是char
。可以将未初始化的局部变量(也可以不是static
设置为任意值。
为简单起见,我们将说int
数据类型实际上是四个字节长。
下一步是将单 char
变量读入该四字节int
的地址中。所以最终得到的是内存:
+-----+-----+-----+-----+
firstChar: | 'a' | ? | ? | ? |
+-----+-----+-----+-----+
int
的第一个字节设置为97(假定ASCII),而其他字节仍设置为任意值。
由于整数是由所有四个字节组成的,所以这就是为什么出现32609
之类的东西。
显而易见的解决方案是使用一个char
变量,该变量将仅使用一个字节。这样,当您覆盖该字节时,它将完全代表您读取的内容:
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
int main() {
char firstChar = 0xff; // force it so you *know* it changes.
int fdInput = open("file.txt", O_RDONLY);
if (fdInput == -1) {
perror("file");
_exit(1);
}
read(fdInput, &firstChar, 1);
printf("Taille du nom de fichier : %d\n", firstChar); // prints 97
close(fdInput);
}