我在使用我的代码时遇到了一些麻烦,即打开一个文件,计算其中的字符数,然后使用malloc()
进行分配。然后我应该使用fread()
从一个文件(我的包含“Hello World!”)中读取字符,并使用.txt
将它们写入空白fwrite
文件。
到目前为止我的代码是打印损坏的字符。我找不到任何足以解决我问题的问题。如果有人能告诉我我做错了什么我会很感激。我认为这是针对我的fread
和fwrite
来电,但我尝试过的都没有。
有问题的代码(尚未评论,抱歉!):
#include <stdio.h>
#include <stdlib.h>
//initialized using ./a.out in.txt out.txt
int main(int argc, char *argv[])
{
FILE *fp;
int count, end;
char *memory;
char c[64];
fp = fopen(argv[1], "r");
if((fp) == NULL)
{
printf("Error: cannot open file.\n");
}
else
{
while((fgetc(fp))!= EOF)
{
count++;
}
memory = (char*)malloc(count);
c[64] = fread(memory, sizeof(char), 1, fp);
fclose(fp);
fp = fopen(argv[2], "w");
fwrite(c, sizeof(char), sizeof(c), fp);
fclose(fp);
free(memory);
}
return 0;
}
答案 0 :(得分:3)
代码有逻辑错误,如下所示
int count= 0 , char c[64]= {0};
memory = malloc(count);
fseek(fp,0,SEEK_SET);
c[64] = fread(memory, sizeof(char), 1, fp);
如果您正在阅读单个char
,则应阅读完整文件。要阅读完整文件,请执行fread(memory, 1, count, fp);
并且c [64]超出范围且fread
返回成功读取的char数。
fwrite(c, sizeof(char), sizeof(c), fp);
在这里你正在编写完整的char数组到文件,但是你只读取了数组中的单个变量,读取了多少个char。因此,您正在将未初始化的char数组写入文件。所以你在文件中得到了损坏的字符。
要在文件中写入fwrite(memory, 1, count, fp);
要解决问题,请避免上述错误并在char数组中读取完整文件然后写入。
答案 1 :(得分:1)
好吧,这里有很多问题,我会从最不好的开始:
memory = (char*)malloc(count);
转换malloc()
是不必要的,可能会掩盖错误,有关详细信息,请参阅here。
int count;
您永远不会将count
初始化为任何内容。这是未定义的行为,并且无法保证它将从0开始。它可以从内存中留下的随机垃圾开始。 end
c[64] = fread(memory, sizeof(char), 1, fp);
这里有2个问题。 c[64]
超出了数组c
的范围,因为索引从0开始,因此数组中的最后一个元素是c[63]
。 sizeof(char)
定义为1,因此请改用1。此外,fread()
会返回读取的字符数,因此不确定您尝试对该值执行的操作。
fwrite(c, sizeof(char), sizeof(c), fp);
您正在将完整的未初始化数组写入文件(=垃圾)