d173220523 发表于 2020-4-24 12:18

滴水初级3.10课后题,运行下面两种代码后为什么会出现这种问题

本帖最后由 d173220523 于 2020-4-28 21:36 编辑

2、将记事本的.exe文件读取到内存,并返回读取后在内存中的地址.
3、将内存中的数据存储到一个文件中,(.exe格式),然后双击打开,看是否能够使用.#include <stdio.h>
#include <iostream>
#include <stdlib.h>
using namespace std;
struct node{ //换了一种方式,使用链表存储更加灵活
    char data;
    struct node *next;
};
int main(){
    FILE *pFile = fopen("D://1.exe", "rb");
    FILE *wFile = fopen("D://2.exe", "ab+");
    char buf;
    int ret = 0;
    node *p = (node *)malloc(sizeof(node));
    node *head = p;
    while((ret = fread(buf, sizeof(char), 1, pFile))){
      node *x = (node *)malloc(sizeof(node));
      x->data = *buf;
      p->next = x;
      p = x;
    }
    p->next = NULL;
    head = head->next;
    while(head->next != NULL){
      fwrite(&(head->data), sizeof(char), 1, wFile);
      head = head->next;
    }
    return 0;
}#include "stdafx.h"#include "stdio.h"
#include <stdlib.h>

void pula()
{
      FILE *fp;
      FILE *fp1;
      //判断是否打开文件
      if ( (fp = fopen("c:\\123.exe", "rb")) == NULL )
                puts("Fail to open file!");


      //或者文件大小
      fseek(fp,0,2);
      int z = ftell(fp);
      //申请内存空间
      char* date = (char*)malloc(z);
      if(date == NULL)
                puts("申请失败");
      //让指针回到开头位置
      fseek(fp,0,0);
      //写入内存中
      for(int i = 0; i<z;i++)
      {
                fscanf(fp, "%c", (date+i));
                printf("写入内存成功\n");
      }
      //判断打开文件如果文件不存在就创建一个叫1111.exe的文件
      if ( (fp1 = fopen("c:\\1111.exe", "wb")) == NULL )
                puts("Fail to open file!");
      //写入数据
      for(i=0;i<z;i++)
      {
                fprintf(fp1,"%c",*(date+i));
                printf("写入文件成功\n");

      }
      free(date);//释放内存空间
      fclose(fp1);//操作结束后关闭文件
      fclose(fp);//操作结束后关闭文件
}


int main()
{
      pula();

      return 0;
}

xunxunmimi0936 发表于 2020-4-24 12:41

好东西值得大家试用学习。

nstar1221 发表于 2020-4-24 12:41

代码有点乱。思路是这样,把exe读出来,然后算一下大小,输出,重置文件指针,然后再把buffer直接存成文件就行了。小文件直接写就可以,没别要用循环

又红又专 发表于 2020-4-24 12:46

...........头一次看到
for (int i = 0; i < z; i++)
        {
                fscanf(fp, "%c", (date + i));
                printf("写入内存成功\n");
        }

这样把文件写入内存?

天赐淡雅香 发表于 2020-4-24 13:23

好东西值得学习。

斩风 发表于 2020-4-24 18:52

好东西,慢慢学习

nj001 发表于 2020-4-25 00:28

看提示是fseek执行错误了

d173220523 发表于 2020-4-28 21:22

nstar1221 发表于 2020-4-24 12:41
代码有点乱。思路是这样,把exe读出来,然后算一下大小,输出,重置文件指针,然后再把buffer直接存成文件 ...

fscanf(fp, "%c", (date ));
            
需不需要把%c改成%s?

nstar1221 发表于 2020-4-29 10:52

d173220523 发表于 2020-4-28 21:22
fscanf(fp, "%c", (date ));
            
需不需要把%c改成%s?

直接用fwrite就行
页: [1]
查看完整版本: 滴水初级3.10课后题,运行下面两种代码后为什么会出现这种问题