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个字符,而不是数字......),这与文件中的整数无关.
如果我不能这样做,我正在考虑记住字符串中的数字,然后将字符串转换为数字..但是我看到一些代码像我在代码中那样做得很好,所以我得到了很困惑.
我在这里缺少什么?