C读取文件和打印缓冲区



我正在学习C,我一直在尝试读取一个文件并打印我刚刚读取的内容。我打开文件,需要调用另一个函数来读取并返回刚刚读取的句子。如果一切顺利,我的函数将返回1,否则返回0。我已经试着让它发挥作用一段时间了,但我真的不明白为什么我不能给line它的价值。总的来说,它总是打印(null)。

项目的结构必须保持不变,我绝对必须使用openread。不是fopen,或者其他什么。。。如果有人能向我解释,那就太棒了。

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#define BUFF_SIZE 50
int     read_buff_size(int const fd, char **line)
{
    char    buf[BUFF_SIZE];
    int     a;
    a = read(fd, buf, BUFF_SIZE);
    buf[a] = '';
    *line = strdup(buf);
    return (1);
}
int     main(int ac, char **av)
{
    char    *line;
    int     fd;
    if (ac != 2)
    {
        printf("error");
        return (0);
    }
    else
    {
        if((fd = open(av[1], O_RDONLY)) == -1)
        {
            printf("error");
            return (0);
        }
        else
        {
            if (read_buff_size(fd, &line))
                printf("%sn", line);
        }
        close(fd);
    }
}

此处:

char    buf[BUFF_SIZE];
int     a;
a = read(fd, buf, BUFF_SIZE);
buf[a] = '';

如果可读取的字符数超过BUFF_SIZE,则将完全填充数组,并且buf[a]将超过数组的末尾。您应该将buf的大小增加一个字符:

char buf[BUFF_SIZE + 1];

或者,更合乎逻辑地给出宏名称,少读一个字符:

a = read(fd, buf, BUFF_SIZE - 1);

您还应该检查strdup()read()的返回是否有错误,因为它们都可能失败。

read(fd,buf,BUFF_SIZE)//UB如果字符串与BUFF_SIZE 相同或更长

u需要+1个字节来存储0,所以在读取时使用BUFF_SIZE-1,在数组分配时使用+1。。。此外,您还应该检查所有返回的值,如果出现故障,则返回0

保持简单,看看:

https://github.com/mantovani/apue/blob/c47b4b1539d098c153edde8ff6400b8272acb709/mycat/mycat.c

(直接从来源归档表格:http://www.kohala.com/start/apue.tar.Z)

#define BUFFSIZE    8192
int main(void){
    int     n;
    char    buf[BUFFSIZE];
    while ( (n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
        if (write(STDOUT_FILENO, buf, n) != n)
            err_sys("write error");
    if (n < 0)
        err_sys("read error");
    exit(0);
}

无需使用堆(strdup)。只要read返回一个大于0的值,就只需要将缓冲区write设置为STDOUT_FILENO(=1)。如果以read返回0结束,则整个文件已被读取。