You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现文件单词查找并写入新文件?C语言SIC汇编器代码排查

关于文件查找关键字与SIC汇编器第一遍处理的问题排查

嘿,我来帮你搞定这两个问题!先从通用的文件关键字查找方法说起,再逐一排查你SIC汇编器代码里的坑~

一、如何在文件中查找指定单词并写入相关内容到新文件

这事儿逻辑很清晰,分几步走就行:

  • 打开文件:用fopen()函数,源文件选"r"模式只读打开,目标文件选"w"模式写入(注意这个模式会覆盖已有文件)。一定要检查fopen()的返回值,如果是NULL说明文件打不开,得及时报错退出。
  • 读取内容并匹配关键字:可以用fscanf()逐词读取,或者fgets()逐行读取后再拆分单词。用strcmp()函数对比读取到的单词和目标关键字,注意这个函数是大小写敏感的,要是需要忽略大小写得自己额外处理。
  • 写入目标文件:一旦匹配到关键字,就把对应的内容(比如所在行、后面关联的地址等)用fprintf()写入到目标文件里。
  • 收尾工作:操作完成后必须用fclose()关闭所有打开的文件,不然会造成资源泄漏。

二、你的SIC汇编器第一遍处理程序问题排查

先把你贴的代码片段放出来,咱们逐行揪问题:

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
int main(int argc, char *argv[]) { 
    FILE *source; 
    FILE *intermediate; 
    rewind(source); // 这里踩坑了!
    char word[10]; 
    unsigned int address = 0; 
    char start[5] = "START"; // 这里也有问题
    source = fopen(argv[1],"..."); // 打开模式没写对
    // 缺少打开intermediate的代码
    // 缺少读取匹配的逻辑
    // 没关文件
    return 0;
}

具体问题点:

  1. 提前调用rewind(source):source一开始是未初始化的野指针,直接调用rewind()会触发未定义行为,程序大概率崩溃。而且刚打开的文件指针本来就在开头,其实根本不需要rewind(),真要调用也得等fopen()成功之后。
  2. start数组长度不够:字符串"START"有5个字符,但C语言字符串必须以'\0'结尾,所以char start[5] = "START";会导致数组溢出,直接改成char start[] = "START";让编译器自动分配足够的空间就好。
  3. fopen()的打开模式不明确:"..."是什么?应该写成"r"表示只读打开源文件,不然没法正确读取内容。
  4. 没打开目标文件intermediate:你要写入新文件,得先打开它啊!比如加一句intermediate = fopen("intermediate.txt", "w");,同样要检查是否打开成功。
  5. 缺少核心的读取匹配逻辑:你得循环读取源文件里的单词,判断是否是START,如果是就读取后面的起始地址再写入目标文件。
  6. 没有错误检查:打开文件、读取地址这些操作都可能失败,得加判断,不然程序遇到异常情况就直接崩了。
  7. 未关闭文件:程序结束前一定要关闭所有打开的文件,不然资源会被占用。

修正后的示例代码

我给你改好了代码,你可以参考:

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

int main(int argc, char *argv[]) { 
    // 先检查命令行参数够不够
    if (argc < 2) {
        printf("用法:%s <源汇编文件名>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    FILE *source = fopen(argv[1], "r"); 
    FILE *intermediate = fopen("intermediate.txt", "w"); 

    // 检查文件是否打开成功
    if (source == NULL) {
        perror("打开源文件失败");
        exit(EXIT_FAILURE);
    }
    if (intermediate == NULL) {
        perror("打开中间文件失败");
        fclose(source); // 已经打开的源文件要先关了再退出
        exit(EXIT_FAILURE);
    }

    char word[10]; 
    unsigned int address = 0; 
    char start[] = "START"; // 自动处理字符串终止符

    // 逐词读取源文件内容
    while (fscanf(source, "%s", word) != EOF) {
        if (strcmp(word, start) == 0) {
            // 读取起始地址(假设是十六进制格式)
            if (fscanf(source, "%x", &address) == 1) {
                fprintf(intermediate, "START起始地址:0x%04X\n", address);
                printf("成功提取START地址:0x%04X\n", address);
            } else {
                fprintf(intermediate, "错误:START关键字后未找到有效起始地址\n");
                printf("错误:START关键字后未找到有效起始地址\n");
            }
            break; // 第一遍处理只需要找一次START,找到就退出循环
        }
    }

    // 关闭所有文件
    fclose(source);
    fclose(intermediate);

    return 0;
}

这个代码加了完整的错误检查,逻辑也补全了,你可以编译运行试试,应该能正常提取START的起始地址写入新文件。

内容的提问来源于stack exchange,提问作者topcat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:34:06