鱼C论坛

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

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

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

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

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

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

使用道具 举报

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

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

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

  1. #include <iostream>
  2. #include <fstream>

  3. int main() {
  4.     // 文件名
  5.     const char* filename = "DEMO.DAT";
  6.    
  7.     // 打开文件(以读写二进制模式)
  8.     std::fstream file(filename, std::ios::in | std::ios::out | std::ios::binary);
  9.    
  10.     // 检查文件是否成功打开
  11.     if (!file) {
  12.         std::cerr << "无法打开文件: " << filename << std::endl;
  13.         return 1;
  14.     }
  15.    
  16.     // 定位到指定地址(0x02AC0EB4)
  17.     file.seekp(0x02AC0EB4, std::ios::beg);
  18.    
  19.     // 修改值(原值00改为01)
  20.     char newValue = 0x01;
  21.     file.write(&newValue, sizeof(newValue));
  22.    
  23.     // 检查是否写入成功
  24.     if (!file) {
  25.         std::cerr << "写入失败" << std::endl;
  26.         file.close();
  27.         return 1;
  28.     }
  29.    
  30.     std::cout << "修改成功!" << std::endl;
  31.    
  32.     // 关闭文件
  33.     file.close();
  34.    
  35.     return 0;
  36. }
复制代码


### 程序解释:

1. **包含头文件**:
  
  1. #include <iostream>
  2.    #include <fstream>
复制代码

   `fstream`用来处理文件输入输出。

2. **设置文件名**:
  
  1. const char* filename = "DEMO.DAT";
复制代码

   把文件名设为常量字符串。

3. **打开文件**:
  
  1. std::fstream file(filename, std::ios::in | std::ios::out | std::ios::binary);
复制代码

   用`std::ios::in`和`std::ios::out`模式打开文件,即可以读也可以写,同时用`std::ios::binary`表示以二进制模式打开。

4. **检查文件是否成功打开**:
  
  1. if (!file) {
  2.        std::cerr << "无法打开文件: " << filename << std::endl;
  3.        return 1;
  4.    }
复制代码

   如果文件没打开成功,就报个错并退出程序。

5. **定位到指定地址**:
  
  1. file.seekp(0x02AC0EB4, std::ios::beg);
复制代码

   `seekp`函数将文件指针移动到从文件开头算起的`0x02AC0EB4`位置。

6. **修改值**:
  
  1. char newValue = 0x01;
  2.    file.write(&newValue, sizeof(newValue));
复制代码

   把`0x01`写到指定位置。

7. **检查写入是否成功**:
  
  1. if (!file) {
  2.        std::cerr << "写入失败" << std::endl;
  3.        file.close();
  4.        return 1;
  5.    }
复制代码

   如果写入不成功,报个错并退出程序。

8. **关闭文件**:
  
  1. file.close();
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 21:22:27 | 显示全部楼层
非常感谢楼上大师的指点!!!!!!!!!!!受益匪浅!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

  1. #include <iostream>
  2. #include <fstream>

  3. int main() {
  4.     // 文件名
  5.     const char* filename = "DEMO.DAT";
  6.    
  7.     // 打开文件(以读写二进制模式)
  8.     std::fstream file(filename, std::ios::in | std::ios::out | std::ios::binary);
  9.    
  10.     // 检查文件是否成功打开
  11.     if (!file) {
  12.         std::cerr << "无法打开文件!" << std::endl;
  13.         return 1;
  14.     }
  15.    
  16.     // 定位到指定地址 0x02AC0EB4
  17.     std::streampos address = 0x02AC0EB4;
  18.     file.seekp(address);
  19.    
  20.     // 检查定位是否成功
  21.     if (file.fail()) {
  22.         std::cerr << "定位到指定地址失败!" << std::endl;
  23.         return 1;
  24.     }
  25.    
  26.     // 修改为 0x01
  27.     char newValue = 0x01;
  28.     file.write(&newValue, sizeof(newValue));
  29.    
  30.     // 检查写入是否成功
  31.     if (file.fail()) {
  32.         std::cerr << "写入失败!" << std::endl;
  33.         return 1;
  34.     }
  35.    
  36.     // 关闭文件
  37.     file.close();
  38.    
  39.     std::cout << "修改成功!" << std::endl;
  40.     return 0;
  41. }
复制代码


### 解释一下这个程序:
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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-10 09:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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