在c中解析一个文件,并只将特定信息复制到另一个文件

在c中解析一个文件,并只将特定信息复制到另一个文件,c,parsing,C,Parsing,我正试图解析一个文件,以消除“不必要”的信息(空白、注释(标记注释),我知道我需要结合使用fgets和strtok),但我不完全确定在需要每行的位和段时如何做到这一点 示例: 假设文本文件中有一行我需要解析,它是- (\t) foo 54 232 574 #random comment 我希望它的结构是—— foo 54 232 574 我将如何构造我的fgets和strtok函数来正确解析这样的行?这看起来可以很容易地使用regex完成。 因此,即使您不能使用perl或类

我正试图解析一个文件,以消除“不必要”的信息(空白、注释(
标记注释),我知道我需要结合使用
fgets
strtok
),但我不完全确定在需要每行的位和段时如何做到这一点

示例:

假设文本文件中有一行我需要解析,它是-

    (\t) foo  54  232  574   #random comment
我希望它的结构是——

foo 54 232 574

我将如何构造我的
fgets
strtok
函数来正确解析这样的行?

这看起来可以很容易地使用regex完成。 因此,即使您不能使用perl或类似的东西,您也可能希望尝试一下C的正则表达式库

您基本上会使用以下内容:

s/\s\+\(.*\)#.*/\1/
(这是您尝试使用的sed等效代码,今天晚些时候我会用实际的C代码进行更新)

(我假设您希望去掉前导空格和尾随空格)

PCRE中的等效值:

\s+(.*)#.*


这应该行得通。它从stdin读取数据并写入stdout。我注意到你假设没有超过256行,我在这里做了同样的假设

#include <stdio.h>
#include <string.h>
int main(void) {
        char buf[256];
        while(fgets(buf, sizeof(buf), stdin)) {
                char *hash = strchr(buf, '#');
                if(hash) *hash = 0; // terminate at the '#'

                char *word = strtok(buf, " \t\n");
                int count = 0;
                while(word) {
                        printf("%s%s", count++ ? " " : "", word);
                        word = strtok(NULL, " \t\n");
                }
                if(count) {
                        printf("\n");
                }
        }
        return 0;
}
#包括
#包括
内部主(空){
char-buf[256];
while(fgets(buf、sizeof(buf)、stdin)){
char*hash=strchr(buf,#’);
如果(hash)*hash=0;//终止于“#”
char*word=strtok(buf,“\t\n”);
整数计数=0;
while(word){
printf(“%s%s”,count++?”:“”,word);
word=strtok(空,“\t\n”);
}
如果(计数){
printf(“\n”);
}
}
返回0;
}

更新此代码对您的输入执行以下操作:

[Charlies-MacBook-Pro:~/junk] crb% a.out < i > o
[Charlies-MacBook-Pro:~/junk] crb% cat o
//This is a sample file I just made to use
.text
main:
la $s0, Var1
lw $s0, 0($s0)
exit:
li $v0, 10
syscall
.data
Var1: .word 32
[Charlies MacBook Pro:~/junk]crb%a.outo
[Charlies MacBook Pro:~/junk]crb%cat o
//这是我刚刚制作的一个示例文件
.文本
主要内容:
la$s0,Var1
lw$s0,0$s0
出口:
李$v0,10
系统调用
.数据
Var1:.word32

到目前为止,您在编写代码方面做了哪些尝试?我首先想确保我正确地阅读了所有的行,因此我现在拥有的是:while(!feof(file)){char str[256];fgets(str,256,file);fprinf(file2,“%s”,str);}但是我不确定我是否可以在strtok中使用多个分隔符,或者如果我使用了错误的方法,那么它一定是在C中吗?虽然我非常喜欢C,但如果您能使用Perl,这项任务会更容易。(并不是说你不能用C语言来做,你绝对可以,只是推荐一个替代工具来完成这项工作。)是的,它必须用C语言,谢谢你的推荐想法谢谢你的回复!我将尝试一下,看看它是如何工作的这对于删除注释很有效,但是没有正确处理空白或\t,谢谢。它在您的测试用例中对我很有效。你确定你抄对了吗?它产生了什么似乎不正确的东西?我使用了一个比我的测试用例更深入的文件,在这里发布它的最佳方式是什么?把它放到pastebin.com上,告诉我你认为它出错的那一行。