背景:我试图打开一个我修改过的文件,并为它的所有内容保留足够的堆内存。然而,我正在努力寻找一个解决方案,在程序结束之前,所有文件的内容都被读入堆内存。
最佳猜测:我认为我在堆内存中没有保留足够的字节| | |我将指针转换为错误的类型(当前为char类型),这可能会对保留堆内存的方式和数量产生不利影响。
FILE *fptr3;
void highgest_and_lowest_Jan123(void)
{
int c;
unsigned int i = 0;
char *file;
long int size = 0;
fptr3 = fopen("/Users/sam/Desktop/Altered_AL_Weather_Station.txt", "r+");
if (fptr3 == 0)
{
printf("There was an error creating the file.\n");
exit(0);
}
fseek(fptr3, 0, SEEK_END);
size = ftell(fptr3);
file = (char *) malloc(size * sizeof(char));
if(!file)
{
puts("Not enough memory");
exit(1);
}
fseek(fptr3, 0, SEEK_SET);
do
{
c = fgetc(fptr3);
if ((int)c == EOF)
break;
file[i] = c;
printf("%c", file[i]);
i++;
} while((int)c != EOF);
// pus memory back on the heap
free(file);
}
以下是我当前的输出:
但是,我的输出应该是:
最佳答案
在大多数系统上,EOF
的值正在扩展到-1
。fgetc
正在返回int
。但你把它读成了一个变量。现在假设您的文件包含char
的值。在这种情况下,0xFF
的字节值将是c
,当转换为0xFF
时,它将变成int
,这是0xFFFFFFFF
int
值的表示。然后将其与-1
进行比较,比较返回true,从而有效地停止循环。解决方案:声明EOF
为c
。