背景:我试图打开一个我修改过的文件,并为它的所有内容保留足够的堆内存。然而,我正在努力寻找一个解决方案,在程序结束之前,所有文件的内容都被读入堆内存。
最佳猜测:我认为我在堆内存中没有保留足够的字节| | |我将指针转换为错误的类型(当前为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的值正在扩展到-1fgetc正在返回int。但你把它读成了一个变量。现在假设您的文件包含char的值。在这种情况下,0xFF的字节值将是c,当转换为0xFF时,它将变成int,这是0xFFFFFFFFint值的表示。然后将其与-1进行比较,比较返回true,从而有效地停止循环。解决方案:声明EOFc

09-10 09:31