鱼C论坛

 找回密码
 立即注册
查看: 401|回复: 3

请教高手怎样用C++读写文件

[复制链接]
发表于 2024-7-19 17:51:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我想读取一个文件指定地址的16进制值,将其修改为其他数值,不知道怎样写代码,救助一下!
比如我想把文件 DEMO.DAT 中,地址02AC0EB4的数值由原来的00修改为01,要怎样操作呢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-19 17:53:03 | 显示全部楼层
哈哈,这个问题不难,咱们先别慌。其实用C++读写文件就像是打开一本书,然后用铅笔在指定的页码和行数上做些小记号。下面我给你一步步讲解一下:

1. **打开文件**:我们要用`fstream`库来操作文件,首先得包含这个头文件。
2. **定位到指定地址**:使用文件指针,将其移动到你想修改的位置。
3. **读取原始值并修改**:这步就像用橡皮擦掉一个字母然后写上新的。
4. **保存修改**:记得保存,不然会忘哦!

好,为了让你更容易理解,我写一个简单的小程序示范一下:
#include <iostream>
#include <fstream>

int main() {
    // 文件名
    const char* filename = "DEMO.DAT";
    
    // 打开文件(以读写二进制模式)
    std::fstream file(filename, std::ios::in | std::ios::out | std::ios::binary);
    
    // 检查文件是否成功打开
    if (!file) {
        std::cerr << "无法打开文件: " << filename << std::endl;
        return 1;
    }
    
    // 定位到指定地址(0x02AC0EB4)
    file.seekp(0x02AC0EB4, std::ios::beg);
    
    // 修改值(原值00改为01)
    char newValue = 0x01;
    file.write(&newValue, sizeof(newValue));
    
    // 检查是否写入成功
    if (!file) {
        std::cerr << "写入失败" << std::endl;
        file.close();
        return 1;
    }
    
    std::cout << "修改成功!" << std::endl;
    
    // 关闭文件
    file.close();
    
    return 0;
}

### 程序解释:

1. **包含头文件**:
#include <iostream>
   #include <fstream>
   `fstream`用来处理文件输入输出。

2. **设置文件名**:
const char* filename = "DEMO.DAT";
   把文件名设为常量字符串。

3. **打开文件**:
std::fstream file(filename, std::ios::in | std::ios::out | std::ios::binary);
   用`std::ios::in`和`std::ios::out`模式打开文件,即可以读也可以写,同时用`std::ios::binary`表示以二进制模式打开。

4. **检查文件是否成功打开**:
if (!file) {
       std::cerr << "无法打开文件: " << filename << std::endl;
       return 1;
   }
   如果文件没打开成功,就报个错并退出程序。

5. **定位到指定地址**:
file.seekp(0x02AC0EB4, std::ios::beg);
   `seekp`函数将文件指针移动到从文件开头算起的`0x02AC0EB4`位置。

6. **修改值**:
char newValue = 0x01;
   file.write(&newValue, sizeof(newValue));
   把`0x01`写到指定位置。

7. **检查写入是否成功**:
if (!file) {
       std::cerr << "写入失败" << std::endl;
       file.close();
       return 1;
   }
   如果写入不成功,报个错并退出程序。

8. **关闭文件**:
file.close();

这样一来,你就能愉快地修改那个文件的指定位置的数值啦!总之,记住这一点,最重要的是不要慌,代码再长都拆得开!祝你编程愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 21:22:27 | 显示全部楼层
非常感谢楼上大师的指点!!!!!!!!!!!受益匪浅!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 21:24:01 | 显示全部楼层
cnbc78925 发表于 2024-07-19 21:22
非常感谢楼上大师的指点!!!!!!!!!!!受益匪 ...


哈哈,不客气,继续来完成这个任务吧。上面的代码还没写完,我接着把完整的程序给你补充好:
#include <iostream>
#include <fstream>

int main() {
    // 文件名
    const char* filename = "DEMO.DAT";
    
    // 打开文件(以读写二进制模式)
    std::fstream file(filename, std::ios::in | std::ios::out | std::ios::binary);
    
    // 检查文件是否成功打开
    if (!file) {
        std::cerr << "无法打开文件!" << std::endl;
        return 1;
    }
    
    // 定位到指定地址 0x02AC0EB4
    std::streampos address = 0x02AC0EB4;
    file.seekp(address);
    
    // 检查定位是否成功
    if (file.fail()) {
        std::cerr << "定位到指定地址失败!" << std::endl;
        return 1;
    }
    
    // 修改为 0x01
    char newValue = 0x01;
    file.write(&newValue, sizeof(newValue));
    
    // 检查写入是否成功
    if (file.fail()) {
        std::cerr << "写入失败!" << std::endl;
        return 1;
    }
    
    // 关闭文件
    file.close();
    
    std::cout << "修改成功!" << std::endl;
    return 0;
}

### 解释一下这个程序:
1. **包含头文件**:`#include <iostream>` 和 `#include <fstream>` 使我们可以使用输入输出流和文件流。
2. **文件名**:定义了文件名为 "DEMO.DAT"。
3. **打开文件**:`std::fstream file(filename, std::ios::in | std::ios::out | std::ios::binary);` 以读写和二进制模式打开文件。
4. **检查文件是否成功打开**:如果无法打开文件,就输出错误信息并返回。
5. **定位到指定地址**:`file.seekp(address);` 将文件指针移动到指定的十六进制地址 0x02AC0EB4。
6. **检查定位是否成功**:如果定位失败,输出错误信息并返回。
7. **修改值**:`file.write(&newValue, sizeof(newValue));` 将值修改为 0x01。
8. **检查写入是否成功**:如果写入失败,输出错误信息并返回。
9. **关闭文件**:操作完成后关闭文件。

这样你就可以顺利地修改文件中指定地址的值啦。记得在尝试修改文件前先备份一下原文件,防止操作失误哦!祝你成功!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 20:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表