2015-10-05 85 views
-1
FILE *infp, *outfp; 
infp = fopen(argv[2], "r"); 

int len; 
char *text; 
fseek(infp, 0, SEEK_END); 
len = ftell(infp); 
printf("%d\n", len); 

if ((text = (char *) malloc(500000000)) == NULL) 
{ 
     fprintf(stderr, "Error allocating memory\n"); 
     exit(1); 
} 
fread(text, len, 1, infp); 
text[len] = '\0'; 
fclose(infp); 
printf("Text = %s, Address = %u\n", text, text); 

回报问题用fread/malloc的

138 
Text = , Address = 3794927632 

我不知道为什么文本不打印任何东西。我以某种方式错误地使用fread?

+1

不要施加'malloc()'它是丑陋的和超级的。为什么'malloc()'这么庞大,只能使用'len'字节,这没有任何意义。它表明你的代码有错误,但你不在乎。 –

+0

你忘记在'ftell'后倒回 –

+0

实际上我们被告知假设输入文件为500MB。 – user1869558

回答

0

fseek(infp, 0, SEEK_END); 

infp指向文件的末尾。你需要倒带文件。

rewind(infp); 

有关其他信息,请参阅http://www.cplusplus.com/reference/cstdio/rewind/

+0

工作,有另一个问题 – user1869558

+1

@ user1869558,我怀疑你打算在'fopen'的调用中使用'argv [1]',而不是'argv [2]'。 –

+0

@ user1869558我也怀疑,在访问'argv'并检查我的答案之前,请检查'argc'的值,您也不确定'fopen()'返回了一个非'NULL'指针。 –

2

您需要的文件位置rewind()fseek(3)复位这样

FILE *infp; 
FILE *outfp; 
int length; 
char *text; 

if ((infp = fopen(argv[2], "r")) == NULL) 
{ 
    fprintf(stderr, "Error openning `%s'\n", argv[2]); 
    return -1; 
} 

fseek(infp, 0L, SEEK_END); 
len = ftell(infp); 
/* reset position */ 
fseek(infp, 0L, SEEK_SET); /* essentially rewind(infp); */ 

printf("%d\n", length); 
if ((text = malloc(length + 1)) == NULL) 
{ 
    fprintf(stderr, "Error allocating memory\n"); 
    return -1; 
} 

if (fread(text, 1, length, infp) == length) 
{ 
    text[length] = '\0'; 

    printf("Text = %s, Address = %u\n", text, text); 
    free(text); /* never forget to `free' */ 
} 
else 
{ 
    free(text); 
    text = NULL: 
} 
fclose(infp); 

你也应该

  1. 检查的fopen()的返回值,你永远不检查文件是否实际被打开,其我认为是主要问题。
  2. 只分配必要的空间。
  3. 确保fread()没有失败。
  4. 交换fread(3)的大小参数,首先是该元件的大小,然后元件

    size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 
    

    的数量和返回值应等于nmemb,在上面的链接阅读手册页面。

+0

轻微:长度应该是'long',因为这是'ftell()'返回的类型。 – chux