从文件中分配内存,然后使用fread和fwrite C.

时间:2015-12-09 07:16:59

标签: c

我在使用我的代码时遇到了一些麻烦,即打开一个文件,计算其中的字符数,然后使用malloc()进行分配。然后我应该使用fread()从一个文件(我的包含“Hello World!”)中读取字符,并使用.txt将它们写入空白fwrite文件。

到目前为止我的代码是打印损坏的字符。我找不到任何足以解决我问题的问题。如果有人能告诉我我做错了什么我会很感激。我认为这是针对我的freadfwrite来电,但我尝试过的都没有。

有问题的代码(尚未评论,抱歉!):

#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;   
}

2 个答案:

答案 0 :(得分:3)

代码有逻辑错误,如下所示

  1. 初始化变量int count= 0 , char c[64]= {0};
  2. 不需要输入memory = malloc(count);
  3. 首先,您已经计算了文件中的字符数,因此在再次阅读文件之前,请按fseek(fp,0,SEEK_SET);
  4. 进行回放
  5. c[64] = fread(memory, sizeof(char), 1, fp);如果您正在阅读单个char,则应阅读完整文件。要阅读完整文件,请执行fread(memory, 1, count, fp);并且c [64]超出范围且fread返回成功读取的char数。

  6. fwrite(c, sizeof(char), sizeof(c), fp);在这里你正在编写完整的char数组到文件,但是你只读取了数组中的单个变量,读取了多少个char。因此,您正在将未初始化的char数组写入文件。所以你在文件中得到了损坏的字符。

  7. 要在文件中写入fwrite(memory, 1, count, fp);

  8. 要解决问题,请避免上述错误并在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);

您正在将完整的未初始化数组写入文件(=垃圾)