我正在学习C而且我一直在尝试阅读文件并打印我刚读过的内容。我打开文件,需要调用另一个函数来读取并返回刚刚读取的句子。
如果一切正常,我的函数将返回1,否则返回0。
我一直试图让它工作一段时间,但我真的不明白为什么我不能设法给它line
它的价值。在main中,它总是打印(null)。
项目的结构必须保持不变,我绝对必须使用open
和read
。没有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);
}
}
答案 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
结束,整个文件已被阅读。