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