gpt4 book ai didi

c - 如何使用 posix getline 读取任意长的文本 block

转载 作者:行者123 更新时间:2023-11-30 17:17:49 25 4
gpt4 key购买 nike

我想从文件中读取任意长字符串。我想逐行读取它,但获得一个指向包含完整输入的字符串的指针。显然,我想要对总长度实现一定的可配置限制(可以在每次读取下一行之前检查)。我想使用 POSIX 函数并开始基于 getline() 实现一些简单的东西,从 http://crasseux.com/books/ctutorial/getline.html 开始。我可以使用 getline 来实现此目的,例如通过在 while 循环中执行它并将指针传递到先前读取的字符串的末尾吗?如何释放动态分配的内存?

以下代码可以工作,但只能读取行。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
ssize_t bytes_read;
size_t nbytes = 100;
char *my_string;
FILE *input;

input = fopen("tmp.txt", "r");

my_string = (char *)malloc(nbytes+1);

while((bytes_read=getline(&my_string, &nbytes, input))>=0){
printf("read: %ld bytes", bytes_read);
printf("length of string: %ld bytes", strlen(my_string)-1);
puts(my_string);
}

free(my_string);

fclose(input);

return 0;
}

最佳答案

根据文档(Linux Programmer's Manual):

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

“如果在调用前 *lineptr 设置为 NULL 并且 *n 设置为 0,那么 getline() 将分配一个缓冲区来存储该行。即使 getline() 失败,该缓冲区也应该由用户程序释放。 ”

您不再需要为单行分配缓冲区。

要读取所有行,请分配一个指向字符的指针数组。

char* lines[200];

int MAX_LINES = 10000;
char** lines;
lines = malloc(MAX_LINES * sizeof(char*));
int i = 0;
long totalsize = 0;
long bytesread;

do {
lines[i] = NULL;
bytesread = getline(&lines[i], (size_t) 0 , yourFileHandle);
totalsize += bytesread;
++i;
} while (bytesread > 0);

// Allocate buffer of size totalsize
// Copy the lines into it
// Deallocate all lines pointers

代码未编译或测试。只是给了你这个想法。

关于c - 如何使用 posix getline 读取任意长的文本 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29344754/

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