【发布时间】:2020-05-07 12:15:57
【问题描述】:
fgets() 函数有两个问题。第一个是,如果行的大小比传递的缓冲区长,则该行被截断。第二个是,如果从文件中读取的行嵌入了'\0' 字符,那么就无法知道该行的实际长度。我想替换fgets(),它动态地为读取的行分配空间并提供读取的行的大小。我已经编写了动态分配空间的代码。我无法弄清楚如何读取行的大小。我是初学者。非常感谢。
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <errno.h>
char *myfgets(FILE *fptr, int *size);
char *myfgets(FILE *fptr, int *size) {
char *buffer;
char *ret;
buffer = (char *)malloc((*size) * sizeof(char));
if (buffer == NULL)
error(1, 0, "No memory available\n");
ret = fgets(buffer, *size, fptr);
if (ret == NULL)
error(1, 0, "Error in reading the file\n");
return ret;
}
int main(int argc, char *argv[]) {
char *file;
FILE *fptr;
int size;
char *result;
if (argc != 3)
error(1, 0, "Too many or few arguments <File_name>, <Number of bytes to read>\n");
file = argv[1];
size = atoi(argv[2]);
fptr = fopen(file, "r");
if (fptr == NULL)
error(1, 0, "Error in opening the file\n");
result = myfgets(fptr, &size);
printf("The line read is :%s", result);
free(result);
return 0;
}
【问题讨论】:
-
如果你想处理像
'\0'这样的非ASCII字符,那么你应该使用read(),而不是fgets()。 -
您不能期望以任何有意义的方式处理 c 类型字符串中的
\0。 -
@r3mainer "... 非 ASCII 字符,如
'\0'" -->'\0'是 ASCII 字符 (ASCII NUL)。当'\n'读取时,read()不会停止读取。所以也不符合要求。 -
@Manikandan:您可以通过单击其分数下方的灰色复选标记来接受其中一个答案。
标签: c