read()在c中无法正常工作

时间:2016-10-08 17:35:17

标签: c io

我试图通过使用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似乎解决了问题,但我不明白为什么。

1 个答案:

答案 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);
}