fgetc从点跳到新行
我试图让fgetc读取一个文件,并从某个指示符跳到新行。这似乎是一个简单的问题,但我找不到任何关于它的文档 以下是我的问题的一个例子: read this in ; skip from semicolon on to new line 用英文读这篇文章;从分号跳到新行 我对解决方案的最佳猜测是读取整个文件,并使用strtok跳过每一行;到队伍的尽头。显然,这是可怕的低效。有什么想法吗fgetc从点跳到新行,c,fgetc,C,Fgetc,我试图让fgetc读取一个文件,并从某个指示符跳到新行。这似乎是一个简单的问题,但我找不到任何关于它的文档 以下是我的问题的一个例子: read this in ; skip from semicolon on to new line 用英文读这篇文章;从分号跳到新行 我对解决方案的最佳猜测是读取整个文件,并使用strtok跳过每一行;到队伍的尽头。显然,这是可怕的低效。有什么想法吗 *我需要使用fgetc或类似fgetc的东西来逐个字符解析文件最简单的方法是读入整行,如果有,则截断 char
*我需要使用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”
找到后
在行中,并在那里粘贴一个'\0'
,缓冲区如下所示:
“在\0中读取此内容,从分号跳到新行\n\0”
因此,for循环从r
开始,在第一个\0
处停止,如果需要使用fgetc()
,那么您可能需要将所有内容回显到行的第一个分号,并抑制从分号到行尾的所有内容。顺便提一下,我注意到getc()
在功能上等同于fgetc()
,由于此代码将从标准输入读取并写入标准输出,因此使用getchar()
和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;
}
#包括
#包括
内部主(空)
{
INTC;
bool read_分号=false;
而((c=fgetc(stdin))!=EOF)
{
如果(c=='\n')
{
普查尔(c);
read_分号=false;
}
else如果(c==';')
read_分号=true;
else if(读取分号==false)
普查尔(c);
/*else被抑制,因为read_分号为true*/
}
返回0;
}
如果没有C99和
,可以分别使用int
、0
和1
来代替bool
、false
和true
。如果愿意,您可以使用else(!read\u semi\u colon)
。//兼容fgets函数读取由分隔符指定的字符。
//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;
}
//然而,文件流一直持续到换行。
//s:缓冲区,n:缓冲区大小
char*fgets\u delim(char*s,int n,FILE*fp,char分隔符){
int i,ch=fgetc(fp);
if(EOF==ch)返回NULL;
对于(i=0;i您要保留的字符串部分如何处理?逐字符读取?是否有理由不使用fgets
一次读取整行?对于保留的文本,我希望理想情况下逐字符串读取(即,以空格分隔的字符数组).fgets可以读取整行直到指定的行长度,但我希望读取字符直到“;”执行此操作的问题是我需要使用fgetc。我只能在文件上使用fgetc,因为没有“sgetc”在c语言中,如果我没有弄错的话?谢谢!那是因为你不需要sgetc
,我将扩展我的示例。这是可行的,但问题是为了使用它,我需要创建一个新文件来重新打印除;->之外的所有内容。我可能会这样做。如果你不必使用fgetc()
,因为您接受了一个不使用fgetc()的答案,所以您没有这样做
,则您不需要此代码。问题是,您的问题不完整;您没有在分号之前说明需要对数据执行什么操作。回显到输出是一个简单的选项;将数据存储到可由其他函数处理的数组中需要对上述代码进行一些修改。不完整的规范会导致错误请回答;它们也容易激怒那些试图帮助你的人。(我不太大惊小怪,我没花多长时间就写出来了!)