【发布时间】:2021-03-14 21:02:32
【问题描述】:
我正在尝试读取文件的内容并将这些内容复制到具有动态内存的字符串中。然而,我的程序一直只为 x 分配 8 个字节。最终,我试图创建一个通用函数,它可以从文件中读取内容,然后将内容作为字符返回。任何帮助表示赞赏。
char* readFile(unsigned long size, char *fileName) {
FILE *file = fopen(fileName, "r");
int c;
if(file != NULL)
{
while(c != EOF){ //calculate size of file
c = fgetc(file); //store character
size++;
}
char *x = (char *)malloc((size) * (sizeof(char))); // Size of x = 8 and I'm not sure why
rewind(file);
printf("\n");
int i = 0;
while(size - 1 > i){ //Reading the files contents to the allocated string
c = fgetc(file); //store character
if(c == EOF){
break;
}
x[i] = c;
i++;
}
fclose(file);
printf("Done Reading");
}
else
{
printf("\nError: Unable to open the file for Reading.\n");
}
rewind(file);
return 0;
}
我在运行时遇到分段错误
char* str = readFile(size, originalFile);
【问题讨论】:
-
fgetc()返回int,而不是char。将从fgetc()返回的int值填塞到char中意味着您将无法可靠地检测到EOF- 因为EOF不是char值。跨度> -
您如何准确测量您分配的内存?
-
while(c != EOF)在第一次迭代中c未初始化使用。 -
readFile返回char *但其中唯一的return语句是:return 0;(即)它返回NULL你想要返回什么? -
为什么要传递
size作为参数?它被 添加 到函数中,但您必须依靠调用者传递 0。您可能想要的是:size_t readFile(const char *fileName)作为签名并想要做:return size;您需要一个局部变量:函数中的size_t size = 0;。实际上,您可能希望off_t而不是size_t来处理非常大的文件。