gpt4 book ai didi

c - 逐行读取文件,read() 抓取整个文件

转载 作者:太空宇宙 更新时间:2023-11-04 03:11:39 25 4
gpt4 key购买 nike

我在逐行读取文件时遇到问题。显然 read() 系统调用获取了整个文件。我正在尝试读取包含可变长度行的文件,但我知道任何行的长度都不能超过 SBUFSIZE 字节。我应该读取文件中的每一行并将文件的每一行放入数据结构中。然而,我的方法将整个文件作为一行推送到数据结构上,这是 Not Acceptable 。 read() 是否有在 '\n' 字符处停止的修改版本?

#define SBUFSIZE 1025

pthread_mutex_t buffer_lock;

void* process_file(void* file_name)
{
int input_fd;
/* Temporary buffer, for reading in the files, one line at a time. */
char buf[SBUFSIZE];
memset(buf, '\0', SBUFSIZE);

if ((input_fd = open((char*) file_name, O_RDONLY)) == -1) {
fprintf(stderr, "Cannot open the file '%s'\n", (char*) file_name);
pthread_exit((void*) 1); /* This is my error flag. */
}

while (read(input_fd, buf, SBUFSIZE)) {
int ret;
printf("|%s|\n", buf);
while (true) {
pthread_mutex_lock(&buffer_lock);
ret = stack_push(buf);
if (ret == STACK_FULL) {
pthread_mutex_unlock(&buffer_lock);
usleep(rand() % 101);
} else {
break;
}
}
pthread_mutex_unlock(&buffer_lock);
memset(buf, '\0', SBUFSIZE);

if (ret != STACK_SUCCESS) {
exit(EXIT_FAILURE);
}
}

close(input_fd);
pthread_exit((void*) 0); /* This is my good flag. */
}

最佳答案

您可以按如下方式逐行处理:

char buf[SBUFSIZE + 1];
size_t bufsize = 0;

for(;;)
{
ssize_t nread = read(input_fd, buf + bufsize, SBUFSIZE - bufsize);
if(nread < 0)
perror("read failed");

bufsize += nread;
if(!bufsize)
break; // end of file

const char *eol = memchr(buf, '\n', bufsize);
if(!eol)
eol = buf + bufsize++;
*eol = 0;

printf("processing line: |%s|\n", buf);
process_line(buf);

++eol;
bufsize -= eol - buf;
memmove(buf, eol, bufsize);
}

关于c - 逐行读取文件,read() 抓取整个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55719548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com