0

我试图让 fgetc 读取文件并从某个指示符跳到新行。这似乎是一个简单的问题,但我找不到任何文档。

这是我的问题的一个例子:

读这个;从分号跳到新行

我对解决方案的最佳猜测是读取整个文件,并为每一行使用 strtok 跳过 ; 到行尾。显然,这是非常低效的。有任何想法吗?

*我需要使用 fgetc 或类似 fgetc 的东西来逐字符解析文件

4

3 回答 3

1

最简单的做法是读入整行,如果有;.

char buffer[1024], * p ;

if ( fgets(buffer, sizeof(buffer), fin) )
{
  if (( p= strchr( buffer, ';' ))) { *p = '\0' ; }  // chop off ; and anything after
  for ( p= buffer ; ( * p ) ; ++ p )
  {
    char c= * p ;
    // do what you want with each character c here.
  }
}

当您进行读取时,缓冲区最初将包含:

"读入;从分号跳到新行\n\0"

在行中找到;并粘贴 a'\0'后,缓冲区如下所示:

"read this in \0 从分号跳到新行\n\0"

所以 for 循环从 first 开始r并在 first 停止\0

于 2013-12-06T22:26:30.717 回答
0

鉴于使用的要求fgetc(),那么您可能应该回显所有内容,直到该行的第一个分号,并禁止从分号到行尾的所有内容。我顺便注意到这getc()在功能上等同于fgetc()并且由于此代码即将从标准输入读取并写入标准输出,因此使用getchar()and是合理的putchar()。但规矩就是规矩...

#include <stdio.h>
#include <stdbool.h>

int main(void)
{
    int c;
    bool read_semicolon = false;

    while ((c = fgetc(stdin)) != EOF)
    {
        if (c == '\n')
        {
            putchar(c);
            read_semicolon = false;
        }
        else if (c == ';')
            read_semicolon = true;
        else if (read_semicolon == false)
            putchar(c);
        /* else suppressed because read_semicolon is true */
    }
    return 0;
}

如果您没有 C99 和,<stdbool.h>则可以分别使用int,01代替bool, 。如果您愿意,可以使用。falsetrueelse if (!read_semi_colon)

于 2013-12-06T22:38:38.767 回答
0
//Function of compatible fgets to read up to the character specified by a delimiter.
//However file stream keep going until to newline.
//s : buffer, n : buffer size
char *fgets_delim(char *s, int n, FILE *fp, char delimiter){
    int i, ch=fgetc(fp);

    if(EOF==ch)return NULL;
    for(i=0;i<n-1;++i, ch=fgetc(fp)){
        s[i] = ch;
        if(ch == '\n'){
            s[i+1]='\0';
            break;
        }
        if(ch == EOF){
            s[i]='\0';
            break;
        }
        if(ch == delimiter){
            s[i]='\0';//s[i]='\n';s[i+1]='\0'
            while('\n'!=(ch = fgetc(fp)) && EOF !=ch);//skip
            break;
        }
    }
    if(i==n-1)
        s[i] = '\0';
    return s;
}
于 2013-12-06T23:11:36.767 回答