li-heng 2023-03-25 23:06 采纳率: 81.5%
浏览 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日

悬赏问题

  • ¥35 VBA-JSON中文乱码报错
  • ¥50 dac adc的检定规程
  • ¥20 MIT控制器能控制不稳定系统吗
  • ¥15 公司代码X对业务伙伴X无效,处理方法?
  • ¥15 微信内链接跳转到浏览器打开怎么实现
  • ¥15 三角波可以直接加施密特电路整形到矩形波吗实物
  • ¥15 html,php,在使用html请求php文件时发生了错误,无法请求到php文件读取数据库并用javascript进行数据显示,刷新
  • ¥15 touchsocket udp组播
  • ¥20 MAC怎么安装Silverlight 插件?以及安装了怎么启用
  • ¥15 gis系统开发出现命名空间“ESRI.ArcGIS”中不存在类型或命名空间名“Analyst3D”报错