【发布时间】:2019-10-10 12:20:44
【问题描述】:
我有这个函数,它读取一些 .txt 文件的第一行并返回该行供我使用。我不知道这条线有多长,所以我不能有恒定大小的缓冲区。 我的问题是我不能使用这个功能,因为它不是我的代码,它会被认为是作弊(我有我的考试)。
我一直在考虑数组的可变长度,但它是邪恶的,因为它对我说,我可以在某个地方扫描整行,但我不确定在这种情况下我该怎么做(我需要返回该行)
char* readLine(FILE *line) {
char individualChar;
int pos = 0;
int size = 16;
char *buffer = (char *)malloc(size);
while ((individualChar = fgetc(line)) != EOF && individualChar != '\n'){
if (pos + 1 == size){
size *= 2;
char *tmp = (char *)realloc(buffer, size);
if (!tmp){
free(buffer);
fprintf(stderr, "Realloc failed");
return 0;
}
buffer = tmp;
}
buffer[pos] = individualChar;
pos++;
}
buffer[pos] = '\0';
return buffer;
}
【问题讨论】:
-
这是正确的做法。任何使用数组的解决方案都会受到数组大小的限制。
-
您可以调用
fgets()来读取更大的块,而不是调用fgetc()。检查结果的最后一个字符是否为换行符。如果不是,请重新分配缓冲区并再次调用fgets()以获取下一个块。不断重复,直到你得到一个以换行符结尾的块。 -
我不确定您在寻找什么样的答案。您不想通过复制别人的代码来作弊,但我们还能回答什么?
-
是的,VLA 是邪恶的。使用 realloc 是理想的方法,但使用固定数组并仅记录限制(“该程序只能处理少于 4k 字节的文本行”)通常是可以接受的。
-
Barmar 我想知道如何以不同的方式做到这一点。就像“你可以使用函数 something() 来得到这个并且......”不知道如何更好地解释它。 xing .. 这个 int 不等于 char 的 ascii 值并被转换了吗?
标签: c file text readline simplify