使用read()c从文件中读取整数

时间:2015-03-14 13:15:23

标签: c file integer posix

我的文件read()函数有问题。我的文件是这样的:

4boat
5tiger
3end

其中数字是后面的字符串的长度。我需要从输入文件中读取整数和字符串,并使用低级I / O在stdoutput上打印出来。这是我的代码:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>

int main(int argc, char *argv[]){
    int *len, fd, r_l, r_s;
    char *s;
    fd=open(argv[1], O_RDONLY);
    if(fd>=0){
        do{
            r_l=read(fd, len, sizeof(int));
            r_s=read(fd, s, (*len)*sizeof(char));
            if(r_l>=0){
                write(1, len, sizeof(int));
                write(1, " ",sizeof(char));
            }
            if(r_s>=0)
                write(1, s, (*len)*sizeof(char));
        }while(r_l>=0 && r_s>=0);
    }
    return 0;
}

但它不起作用= /

1 个答案:

答案 0 :(得分:0)

你没有为poitner len分配空间,你需要为它分配空间,你可以简单地将它声明为int len;,这样就可以在堆栈中分配它并且你不需要# 39;需要手动处理它的分配,所以它会是这样的

int main(void) {
    int len, fd, r_l, r_s;
    char *s;
    fd = open(argv[1], O_RDONLY);
    if (fd >= 0) {
        do {
            r_l = read(fd, &len, sizeof(int));
            s   = malloc(len); /* <--- allocate space for `s' */
            r_s = 0;
            if (s != NULL)
                r_s = read(fd, s, len);
            if (r_l >= 0) {
                write(1, &len, sizeof(int));
                write(1, " ", 1);
            }
            if ((r_s >= 0) && (s != NULL))
                write(1, s, len);
            free(s);
        } while (r_l >= 0 && r_s >= 0);
        close(fd);
    }
    return 0;
}

你也没有为s分配空间,这是另一个问题,我确实使用s在上面更正的代码中为malloc()分配了空间。

根据定义sizeof(char) == 1,所以你不需要它。

虽然上面的代码没有代码所带来的错误,但是它会调用未定义的行为,但是它不能达到预期的效果,因为使用这种算法无法读取数据。

你文件中的数字不是真正的整数,它们是字符,所以你真正需要的是这个

int main(void) {
    char chr;
    int len, fd, r_l, r_s;
    char *s;
    fd = open(argv[1], O_RDONLY);
    if (fd >= 0) {
        do {
            r_l = read(fd, &chr, 1);
            len = chr - '0';
            s   = malloc(len); /* <--- allocate space for `s' */
            r_s = 0;
            if (s != NULL)
                r_s = read(fd, s, len);
            if (r_l >= 0) {
                printf("%d ", len);
            }
            if ((r_s >= 0) && (s != NULL))
                write(1, s, len);
            free(s);
        } while (r_l >= 0 && r_s >= 0);
        close(fd);
    }
    return 0;
}