【发布时间】:2019-11-05 00:59:23
【问题描述】:
我试图让 read() 系统调用逐行读取我的文件并将每一行反转到标准输出。我的问题是让 read() 逐行读取我的文件,因为通常它只是读取整个文件。我希望 LINE_BUFFER 大小是一条线的最大大小。
我尝试实现一个函数来尝试这样做,但它似乎破坏了程序,我对如何解决这个问题有点迷茫。
这是我的代码:
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#define LINE_BUFFER 1024
int charCount(const char *name1);
ssize_t readline (char *buf, size_t a, int b, off_t *offset);
int main(int argc, char* argv[]) {
if(argc ==2){
charCount(argv[1]);
}else{
printf("Provide a file\n");
}
return 0;
}
int charCount(const char *name1)
{
char buffer[LINE_BUFFER];
int fd;
ssize_t len = 0;
int nread;
int i = 0;
off_t offset = 0;
if ((fd = open(name1, O_RDONLY)) == -1)
{
perror("Error in opening file");
return (-1);
}
int size = lseek(fd,-1, SEEK_END);
while(size>=0)
{
while((len = readline(buffer,LINE_BUFFER,fd,&offset)) != -1){
write(1,buffer,1);
lseek(fd, -2,SEEK_CUR);
size--;
}
}
close(fd);
return(0);
}
ssize_t readline(char *buf, size_t a, int b, off_t *offset)
{
int fd;
ssize_t nchr =0;
ssize_t idx =0;
char *p = NULL;
if ((nchr = lseek(fd, *offset, SEEK_SET)) != -1){
nchr = read(fd,buf,a);
}
p = buf;
while(idx<nchr && *p != '\n') p++,idx++;
*p =0;
if(idx == nchr) {
*offset + nchr;
return nchr < (ssize_t)a ? nchr : 0;
}
*offset += idx+1;
return idx;
}
【问题讨论】:
-
Read 不知道“行”是什么。
read()读取字节。您可以将整个文件读入缓冲区,然后逐行遍历生成的缓冲区,但除此之外,您必须一次读取 1 个字节并在执行过程中检查每个字节。 -
@DavidCRankin 所以你的意思是这不可能?
-
是的,有可能,您可以一次一个字节地完成(这只是处理行的一种尴尬方式)。使用
fgets()一次将一行读入缓冲区要好得多。 (或将整个文件读入缓冲区,然后一次对整个事物进行操作) -
fd在readline()中设置在哪里?它需要是一个函数参数。 -
哦,您将
fd传递给b参数。为什么那个参数不叫fd?