li-heng 2023-03-25 23:06 采纳率: 80.8%
浏览 143
已结题

使用c++读取文件,有没有办法快速定位到某几个类字符

使用c++读取文件,快速定位到某几个字符,有没有办法只读取文件中有某几类字符,
比如:我有一个文件 ,文件大小为1G(不考虑中文,都是ASCII字符),其中有"ASCII文本" 和 "二进制数据" 两种内容,我需要快速找扫描这个文件,只读取其中

"("")""{""}"

字符,其实我就是想校验文件里面是不是都是

(){}

这样的顺序排列,每两个字符中间可以有1个间隔或无数个间隔(间隔可以是空格、二进制、其它字符),有点像代码检查,文件内容如:

(aa)bb{dd}aa(dd){dd}dddd(){#¥%……} (%……&*){……&*%……&*} //重复达到1G
意思是 "("后面一定是 ")",而不会是"}"

我的目的是校验其中的内容,重点是快速从文件中找到这几类字符,因为我可能会反复读取这个文件,所以这次读取要快速过一次,如果可以不用加载到内存只要能识别它的格式就行,后面还有其它对文件的处理。

是不是可以用解析器模式,来快速扫描文件,扫到"("后,下一个一定扫描到 ")",而不是"}或{"

  • 写回答

10条回答 默认 最新

  • Leodong. 2023-03-25 23:21
    关注

    该回答通过自己的思路及结合引用GPTᴼᴾᴱᴺᴬᴵ内容,具体如下:
    可以使用C++中的文件流来读取文件,并使用简单的循环来快速定位目标字符。以下是一个示例代码:

    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main() {
        ifstream file("example.txt");  // 打开文件
        if (!file.is_open()) {  // 检查文件是否成功打开
            cout << "Error opening file" << endl;
            return 1;
        }
    
        char prev_char = '\0';  // 前一个字符
        char curr_char;  // 当前字符
        int line_num = 1;  // 当前行数
        int char_num = 0;  // 当前字符在当前行中的位置
    
        while (file.get(curr_char)) {  // 逐字符读取文件
            char_num++;
    
            // 如果当前字符是目标字符之一
            if (curr_char == '(' || curr_char == ')' || curr_char == '{' || curr_char == '}') {
                // 如果前一个字符是目标字符之一
                if (prev_char == '(' || prev_char == ')' || prev_char == '{' || prev_char == '}') {
                    // 检查前一个字符和当前字符的顺序是否正确
                    if ((prev_char == '(' && curr_char != ')') ||
                        (prev_char == ')' && curr_char != '{' && curr_char != '}' && curr_char != '(') ||
                        (prev_char == '{' && curr_char != '}') ||
                        (prev_char == '}' && curr_char != '(' && curr_char != '{' && curr_char != '}')) {
                        cout << "Error on line " << line_num << ", char " << char_num << endl;
                        file.close();
                        return 1;
                    }
                }
                prev_char = curr_char;
            }
            else if (curr_char == '\n') {  // 如果当前字符是换行符
                line_num++;
                char_num = 0;
                prev_char = '\0';
            }
        }
    
        file.close();  // 关闭文件
    
        cout << "File is valid" << endl;
    
        return 0;
    }
    

    该代码使用文件流ifstream打开文件,逐字符读取文件并检查每个目标字符。如果检测到错误,则输出错误信息并退出程序。否则,当读取整个文件后,输出“File is valid”。

    你也可以根据你的需求对代码进行修改和优化。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

问题事件

  • 系统已结题 4月3日
  • 已采纳回答 3月26日
  • 创建了问题 3月25日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。