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

