标题:关于C++fread和fwrite问题,求帮助~!
只看楼主
q272236218
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2017-5-5
结帖率:100%
已结贴  问题点数:20 回复次数:8 
关于C++fread和fwrite问题,求帮助~!
#pragma once
#define  _CRT_SECURE_NO_WARNINGS
#include<Windows.h>
#include<iostream>
#define FILE_ADDRESS "F:\ipmsg1.exe"
using namespace std;
int FILE_SIZE=0;
static DWORD FILE_open(LPSTR FILE_lujing, LPVOID *FILE_BUFFER)
{
   
   
    FILE *NAME = NULL;
    LPVOID TEP_FILEBUFFER = NULL;
    NAME=fopen(FILE_lujing, "rb");
    if (!NAME)
    {
        cout << "打开文件失败" << endl;
        return 0;
    }
    fseek(NAME, 0, SEEK_END);//设置指针
    FILE_SIZE = ftell(NAME);
    fseek(NAME, 0, SEEK_SET);//设置指针
    TEP_FILEBUFFER = malloc(FILE_SIZE);
   
    if (!TEP_FILEBUFFER)
    {
        cout << "分配内存空间失败" << endl;
        fclose(NAME);
        return 0;
        
    }
   
    size_t n=fread(TEP_FILEBUFFER, 1, FILE_SIZE, NAME);
    FILE* FILE_NEW = fopen(FILE_ADDRESS, "wt+");
   
    size_t y=fwrite(TEP_FILEBUFFER, 1, FILE_SIZE, FILE_NEW);

为什么读取时候和写出时文件大小不一样。用UE看有字节错位的问题,怎么回事 求大大相助
搜索更多相关主题的帖子: include return 
2017-05-05 10:28
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
第一,你应该贴完整的代码
第二,你应该贴正确的代码,"F:\ipmsg1.exe"肯定不对吧,C/C++中没有'\i'这个转义符,难道你从来不看编译警告?
"wt+"中“+”是“追加”的意思,如果之前有内容,那么字节数当然可能不等
"wt+"中“t”是“文本”的意思,当然可能字节数不一致了,比如"\n"可能会转换成"\r\n",所以低于0x20的字符都是命令字符,打印它们会出现什么情况取决于操作系统。

程序代码:
#include <cstdio>
#include <iostream>
using namespace std;

int main( void )
{
    FILE* src = fopen( "F:\\a.exe", "rb" );
    FILE* dst = fopen( "F:\\b.exe", "wb" );
    if( src && dst )
    {
        fseek( src, 0, SEEK_END );
        long size_file = ftell( src );
        fseek( src, 0, SEEK_SET );

        void* buf = malloc( size_file );
        if( buf )
        {
            size_t size_read = fread( buf, 1, size_file, src );
            size_t size_write = fwrite( buf, 1, size_read, dst );
            cout << "file  size = " << size_file << '\n'
                << "read  size = " << size_read  << '\n'
                << "write size = " << size_write  << endl;
        }
        free( buf );
    }
    if( dst ) fclose( dst );
    if( src ) fclose( src );

    return 0;
}
2017-05-05 11:03
q272236218
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2017-5-5
得分:0 
回复 2楼 rjsp
"F:\ipmsg1.exe"是宏定义没毛病啊。
2017-05-05 11:08
q272236218
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2017-5-5
得分:0 
回复 2楼 rjsp
大大能加个QQ详细问一下你么 = =
2017-05-05 11:14
q272236218
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2017-5-5
得分:0 
回复 2楼 rjsp
大大、按照你的方式能成功创建一个一样大的PE文件了。但是为什么跑不起来呢。用PETOOL看两个文件的PE结构一样,为什么我创建的不能运行呢。点击以后没有反应
2017-05-05 11:24
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
"F:\ipmsg1.exe"是宏定义没毛病啊。
你认为没毛病我也没办法

大大能加个QQ详细问一下你么 = =
我不觉得在BBS上问答有什么不方便的地方
我不觉得在QQ上问答有什么方便的地方

成功创建一个一样大的PE文件了。但是为什么跑不起来呢。用PETOOL看两个文件的PE结构一样,为什么我创建的不能运行呢。点击以后没有反应
如果文件内容一样却运行不起来,那你只能问程序作者了
我有两个疑问
a. 有没有将错误的"F:\ipmsg1.exe"改为正确的"F:\\ipmsg1.exe"?
b. 文件内容是否一致?这可以用控制台命令 fc/b a.exe b.exe 来比较
2017-05-05 11:50
q272236218
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2017-5-5
得分:0 
回复 6楼 rjsp
都改了 也能生成  现在就是卡在不能运行,确实/i这里有问题。之前也提示过。初学者不懂。编译器也让过了。所以就没当回事。
2017-05-05 12:19
q272236218
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2017-5-5
得分:0 
回复 6楼 rjsp
程序的整个过程是读取文件到FILEBUFFER 内存区。然后模拟程序在运行时的状态进行拉伸。然后用算法将拉伸以后的程序还原回硬盘时的状态。这个过程以后文件的大小没变。并且能用PETOOL打开。证明其是符合PE文件的结构。不知道我这个逻辑对不对呢。但是打不开实在是想不通。论坛上的代码按照您说的修改之后可以生成了 也能运行。但是整个过程以后是无法运行的。老师您觉得问题可能出在哪呢
2017-05-05 12:26
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回复 8楼 q272236218
听不懂,你问程序原作者吧
2017-05-05 12:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-476714-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.067757 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved