【问题标题】:File descriptors: troubles in storing a read int value into a variable文件描述符:将读取的 int 值存储到变量中的麻烦
【发布时间】: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


【解决方案1】:

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

read() 函数只是从您的文件中读取字节(或chars)。这个函数不知道你在读什么类型的东西。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多