文件描述符:将read int值存储到变量中的麻烦

Mar*_*ark 0 c int file descriptor

我正在尝试使用文件描述符.我已经被教导使用文件流(fopen,fread等),但现在我想了解这种使用文件的其他方式.

我要发布的这段代码有点琐碎和愚蠢:它只是打开一个名为"file"的文件,它具有以下结构:4个字符,一个整数和每行的'\n'值.我并没有尝试做任何有用的事情,我只是尝试做一些基本的操作,我曾经非常轻松地使用流.特别是,我的文件有这个信息:

row 1
row 2
row 3
Run Code Online (Sandbox Code Playgroud)

"row"和空格代表4个字符,数字代表整数.我只想打印文件内容,但是我想记住我遇到的int值(否则打印每个符合的字符就足够了)(因此我可以根据该值进行一些详细说明,如果我想要的话)至).这是我使用的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>

int main() {
    int fd;
    fd = open("file", O_RDONLY);

    char *buffer;

    buffer = (char*)malloc(20*sizeof(char));
    unsigned char x;
    int y = -1;
    int number = 1;
    int i=0, j;

    while(read(fd, &x, 1*sizeof(char)) > 0) {
        for(j=0; j<3; j++) {
            buffer[i] = x;
            i++;
            read(fd, &x, sizeof(char)); // or 1 instead of sizeof(char)
        }
        buffer[i] = x;
        buffer[i+1] = '\0';
        printf("byte read: %d\n", read(fd, &y, sizeof(int))); // or 4 instead of sizeof(int): it's the same
        printf("number read: %d\n", y); // crap value
        printf("%s%d\n", buffer, y);

        read(fd, &x, 1); // discard the new line
        i=0;
    }
close(fd);
}
Run Code Online (Sandbox Code Playgroud)

这是麻烦:当我尝试存储int值时,因为sizeof(int)意味着4个字节,所以它只读取4个字符.所以文件描述符提前4个字符,程序根本就没有做我想做的事情(它"吃掉"以下字符:'\n','r','o').我无法理解如何判断下面的字符是一个整数,并且应该占用4个字节的内存.因此,如果尝试在文件中写入4位数字,格式显示是正确的,但它会记住错误的值(因为它看到4个字符,而不是数字......),这与文件中的整数无关.

如果我不能这样做,我正在考虑记住字符串中的数字,然后将字符串转换为数字..但是我看到一些代码像我在代码中那样做得很好,所以我得到了很困惑.

我在这里缺少什么?

mea*_*ers 5

您似乎混淆了在文件中打印出来的字符/字节整数,以及程序中的int变量("占用了4个字节的内存").

read()函数只是char从您的文件中读取字节(或s).这个功能不知道你正在阅读什么样的东西.

如果你想得到一个int,你需要将你读到的字节转换为int.看一看sscanf(),strtol()...

顺便说一句,int确实经常占用4个字节的空间,但情况并非总是如此; 这取决于平台.