我试图让 fgetc 读取文件并从某个指示符跳到新行。这似乎是一个简单的问题,但我找不到任何文档。
这是我的问题的一个例子:
读这个;从分号跳到新行
我对解决方案的最佳猜测是读取整个文件,并为每一行使用 strtok 跳过 ; 到行尾。显然,这是非常低效的。有任何想法吗?
*我需要使用 fgetc 或类似 fgetc 的东西来逐字符解析文件
最简单的做法是读入整行,如果有;
.
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
。
鉴于使用的要求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
,0
和1
代替bool
, 。如果您愿意,可以使用。false
true
else if (!read_semi_colon)
//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;
}