C读取文件和打印缓冲区

时间:2015-12-04 23:46:48

标签: c pointers

我正在学习C而且我一直在尝试阅读文件并打印我刚读过的内容。我打开文件,需要调用另一个函数来读取并返回刚刚读取的句子。 如果一切正常,我的函数将返回1,否则返回0。 我一直试图让它工作一段时间,但我真的不明白为什么我不能设法给它line它的价值。在main中,它总是打印(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] = '\0';
    *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("%s\n", line);
        }
        close(fd);
    }
}

3 个答案:

答案 0 :(得分:2)

下面:

char    buf[BUFF_SIZE];
int     a;

a = read(fd, buf, BUFF_SIZE);
buf[a] = '\0';

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

char buf[BUFF_SIZE + 1];

或者,更逻辑地给出您的宏名称,读取少一个字符:

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

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

答案 1 :(得分:0)

读取(fd,buf,BUFF_SIZE); //如果字符串与BUFF_SIZE

相同或更长,则为UB

你需要+1字节来存储0,所以在读取时使用BUFF_SIZE - 1或在数组分配时使用+1 ...你也应该检查所有返回的值,如果出现故障 - 返回0

答案 2 :(得分: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)。只要write返回一个大于0的值,只需STDOUT_FILENO缓冲区read(= 1)。如果以read结尾0结束,整个文件已被阅读。