【发布时间】:2015-04-30 10:21:06
【问题描述】:
我正在尝试使用文件描述。我被教导使用文件流(fopen、fread 等),但现在我想了解这种使用文件的其他方式。
我要发布的这段代码有点琐碎和愚蠢:它只是打开一个名为“file”的文件,该文件具有以下结构:4 个字符、一个整数和每行一个 '\n' 值。我并不想做任何有用的事情,我只是想做一些我曾经使用流非常轻松地完成的基本操作。特别是,我的文件包含以下信息:
row 1
row 2
row 3
“行”和空格代表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);
}
问题来了:当我尝试存储 int 值时,由于 sizeof(int) 表示 4 个字节,它只读取 4 个字符。所以文件描述符提前了 4 个字符,程序根本不做我想做的事情(它“吃掉”以下字符:'\n'、'r'、'o')。我不明白如何判断下面的字符是一个整数,并且应该占用 4 个字节的内存。因此,如果尝试在文件中写入 4 位数字,格式显示是正确的,但它会记住错误的值(因为它看到 4 个字符,而不是数字...),这与文件中的整数无关.
如果我不能这样做,我正在考虑将数字存储在字符串中,然后将字符串转换为数字。但我看到一些代码与我在代码中所做的完全一样,所以我越来越糊涂了。
我在这里缺少什么?
【问题讨论】:
-
如果这是一个文本文件,为什么您希望读取字符串中的 4 个字符字节等于您存储它的整数变量的值。如果它是基于文本的文件,请阅读text in 作为字符串然后使用转换函数将其转换为字符串表示的整数值
-
在实践中,您应该
read一个大缓冲区(千字节),并且您应该始终保持读取字节数(即read返回的计数)
标签: c file int descriptor