读取特定字符的文本文件

时间:2011-03-20 00:00:40

标签: c parsing

这是我的困境。我有一个文件,并希望读取所有字符,直到程序达到'#',并忽略'#'后该行上的所有内容。例如

0 4001232 0 #comment,discard

这令人沮丧,因为感觉有一个非常简单的解决方案。谢谢!

6 个答案:

答案 0 :(得分:2)

FILE *f = fopen("file.txt", "r");
int c;
while ((c = getc(f)) != '#' && c != EOF)
   putchar(c);

答案 1 :(得分:1)

有很多方法和例子可以做到这一点。通常,想法是拥有一个保持状态的变量(在#之前,在#之后,在\ n之后等)并且在while循环中运行直到EOF。你可以看到一个例子here这是一个删除C评论的程序,但想法是一样的。

答案 2 :(得分:1)

filePointer = fopen("person.txt", "r");

do
{
    read = fgetc(filePointer);
    //stop when '#' read or when file ends
    if (feof(filePointer) || read == '#')
    {
        break;
    }
    printf("%c", read);
} while (1);

fclose(filePointer);

还最好检查文件是否成功打开

if (filePointer == NULL)
{
    printf("person.txt file failed to open.");
}
else
{
    file operations
}

答案 3 :(得分:0)

解决方案取决于你如何“阅读”。

例如,我可以在bash中使用sed 's/#.*//' <infile >outfile删除所有这些评论。

编辑:但是,如果我手动解析它,我可以简单地(在我的循环中解析它)

if(line[i]=='#') {
    continue;
}

通过退出循环停止解析该行。

答案 4 :(得分:0)

使用fgets读取一行,仔细阅读此行,直至找到“#”字符。

阅读另一行......

答案 5 :(得分:0)

这是一个预处理,而不是在脑海中解析问题。无论如何,有许多工具和命令专门做你所要求的。如果可能的话,最好使用它们。

但是,如果您需要或想要在代码中执行此操作,那么这样做的一般方法就是如前所述,保持当前状态并根据状态处理任何新字符。这是一种非常好的通用方法,强烈推荐,特别是需要进行更多的预处理。

然而,如果这绝对是你唯一要做的事情,那么你可以做一些更好的事情并用这样的代码放弃状态:

do {
   // Initialize things (buffer for the characters maybe) per line
   ch = fgetc(input_file);
   while ( (ch != EOF) && (ch != '\n') && (ch != '#') ) // Assuming # is the comment character
   {
        // Do something with 'ch', save it to a buffer, give it to a function - whatever
        ch = fgetc(input_file);
   }
   // If you save the characters to a buffer, this will be a good time to do something with it
   while ( (ch != EOF) && (ch != '\n') ) ch = fgetc(input_file); // Read the rest of the line
while ( ch != EOF );