fread/malloc 的问题
Problems with fread/malloc
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] = '[=11=]';
fclose(infp);
printf("Text = %s, Address = %u\n", text, text);
returns
138
Text = , Address = 3794927632
我不确定为什么文本不打印任何内容。我是不是用错了 fread ?
之后
fseek(infp, 0, SEEK_END);
infp
指向文件末尾。您需要倒回文件。
rewind(infp);
有关其他信息,请参阅 http://www.cplusplus.com/reference/cstdio/rewind/。
您需要使用 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] = '[=10=]';
printf("Text = %s, Address = %u\n", text, text);
free(text); /* never forget to `free' */
}
else
{
free(text);
text = NULL:
}
fclose(infp);
你也应该
- 检查
fopen()
的 return 值,你永远不会检查文件是否真的打开了,我认为这是主要问题。
- 只分配必要的 space。
- 确保
fread()
没有失败。
交换fread(3)
的大小参数,先是元素大小再是元素个数
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
和 return 值应等于 nmemb
,请阅读上面 link 处的手册页。
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] = '[=11=]';
fclose(infp);
printf("Text = %s, Address = %u\n", text, text);
returns
138
Text = , Address = 3794927632
我不确定为什么文本不打印任何内容。我是不是用错了 fread ?
之后
fseek(infp, 0, SEEK_END);
infp
指向文件末尾。您需要倒回文件。
rewind(infp);
有关其他信息,请参阅 http://www.cplusplus.com/reference/cstdio/rewind/。
您需要使用 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] = '[=10=]';
printf("Text = %s, Address = %u\n", text, text);
free(text); /* never forget to `free' */
}
else
{
free(text);
text = NULL:
}
fclose(infp);
你也应该
- 检查
fopen()
的 return 值,你永远不会检查文件是否真的打开了,我认为这是主要问题。 - 只分配必要的 space。
- 确保
fread()
没有失败。 交换
fread(3)
的大小参数,先是元素大小再是元素个数size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
和 return 值应等于
nmemb
,请阅读上面 link 处的手册页。