解析文本文件并写入2个单独的文件

时间:2013-11-23 19:15:14

标签: c parsing

我将一个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)相同的逻辑

1 个答案:

答案 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标题..