我将一个txt文件作为输入,我的第一个解析按预期工作,但我很难得到逻辑来获得第二个解析。
例如:假设txt文件如下所示:
.text
main:
... // some instruction (assembly)
exit:
... // exit instructions
.data
...
我要做的是将.text之后的所有内容保存到一个文件(text.txt,让我们说),将.data之后的所有内容保存到另一个文件(data.txt)。我的第一个解析工作的方式是它将所有内容复制到text.txt,然后在strcmp(str,“。data / n”)== 0时突破。这可以按预期工作,但是我不知道如何获得下半场。
起初我尝试将我的if(strcmp(str,“。data \ n”)== 0)的主体从中断更改为a,同时希望我可以继续使用FILE *文件指针,但是这样结束没有完成执行,我必须退出我的终端。
感谢您的帮助,如果我需要发布任何其他内容,请告诉我。
void preprocessTextFile(FILE* file, FILE* file2, FILE* file3) {
char str[256];
while(!feof(file)){
fgets(str, sizeof(str), file);
if(strcmp(str, ".data\n") == 0){
preprocessDataFile(file, file3);
}
...
}
void preprocessDataFile(FILE* file, FILE* file2) {
char str[256];
while(!feof(file)){
// gets rid of ".data"
char* word = strchr(str, '.');
if(word){
*word = 0;
}
// gets rid of comments
char* hashCom = strchr(str, '#');
if(hashCom){
*hashCom = 0;
}
char* word2 = strtok(str, ", \t\n");
int count = 0;
while(word2){
fprintf(file2, "%s%s", count++ ? " " : "", word2);
word2 = strtok(NULL, ", \t\n");
}
if(count){
fprintf(file2, "\n");
}
}
}
这导致一个永远不会在我的终端中结束的exe。我的策略是它到达.data它使用前一个函数的指针调用preprocessDataFile()(我假设它在传递到preprocessDataFile时仍然指向.data)然后我可以使用它复制其余部分与第二个文件(data.txt)相同的逻辑
答案 0 :(得分:1)
我觉得preprocessDataFile
关注preprocessTextFile
会更加清晰,而不是被它调用。或者至少在调用break
之后放置preprocessDataFile
,因为当满足EOF时,第一个循环中的迭代(在preprocessTextFile
中)将重新开始,直到它再次达到while条件。
注意:fgets
中没有preprocessDataFile
,因此您的文件不再被阅读。这可以解释为什么你的程序会挂起。
第二个注释:您的// gets rid of ".data"
部分代码在str
处理时尚未取消分配。你应该在它之前有一个fgets
。但是,在.data
fgets
的最后一次调用读取(并消耗)preprocessTextFile
部分时,它将毫无用处
在您更新问题之前,我的回答是:请参阅以下示例:
$ cat t.c
#include <stdio.h>
#define strlen 256
int main(void) {
char str[strlen];
FILE *fin = fopen("file", "rt");
FILE *fout1 = fopen("text", "w");
FILE *fout2 = fopen("data", "w");
while (fgets(str, strlen, fin) != NULL) {
if (!strcmp(str, ".data\n") ) break;
fputs(str, fout1);
}
do {
fputs(str, fout2);
} while (fgets(str, strlen, fin) != NULL) ;
fclose(fin);
fclose(fout1);
fclose(fout2);
}
这给出了:
$ gcc t.c && ./a.out
$ cat text
.text
main:
... // some instruction (assembly)
exit:
... // exit instructions
$ cat data
.data
...
您的原始问题没有提及删除评论或删除.data
标题..