2015-04-30 138 views
1

背景:我试图打开一个文件,我修改了并为其所有内容预留了足够的内存。然而,我很努力地找到一个解决方案,在所有文件内容被读入堆内存之前结束程序。无法分配堆内存

最好的猜测:我不认为我已经在堆内存中保留了足够的字节。我把我的指针作为错误类型(目前它是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); 

} 

这里是我的电流输出是什么: enter image description here

但是,这里是我的输出应该是: enter image description here

+0

当您通过程序进行调试时会发生什么?它在哪里失败? – xxbbcc

+0

Windows还是unix? – user3386109

+2

使用'int c;'而不是'char c;''fgetc'的返回值是一个'int'。 –

回答

0

EOF正在扩大的-1大多数系统上的价值。 fgetc正在返回int。但是你正在将它读入一个变量char。现在假定您的文件包含值为0xFF。在这种情况下,c的字节值将为0xFF,其中当投到int时将变为0xFFFFFFFF,这是int-1值的表示。然后将其与EOF进行比较,并且比较返回true,从而有效地阻止您的循环。解决方案:声明cint