C语言 打印从给定字母开始的整行



我试图打印从给定字母到第二个文件开始的行,但它只打印1行,然后停止,即使有更多以给定字母开头的行。如何解决?

#include <stdio.h>
#include <string.h>
int main()
{
FILE* f = fopen("story.txt","r");
char usr;
printf("enter letter: ");
scanf(" %c",&usr);
FILE* f2=fopen("letter.txt","a+");
char buffer[255];
while(fscanf(f, "%[^n]s", buffer)==1)
if (*buffer == usr)
fprintf(f2, "%sn", buffer);
return 0;
}

第二次通过循环时,fscanf(f, "%[^n]s", buffer)无法扫描任何内容,因为前一次调用将n字符留在了缓冲区中。这个不能通过。

fgets()代替fscanf()读取整行

char buffer[255];
while(fgets(buffer, sizeof buffer, f))
if (buffer[0] == usr)
fprintf(f2, "%s", buffer);

我不会使用fscanf来读取一行文本。

//fi - input file
//fo - output file
int copyLines(FILE *fi, FILE *fo, char c)
{
char line[256];
if(fi && fo)
{
while(fgets(line, sizeof(line), fi))
{
if(*line = c)
if(fputs(line, fo) == EOF) return EOF;
}
}
return 0;
}

首先,fscanf调用中的格式字符串不正确

while(fscanf(f, "%[^n]s", buffer)==1)
^^^

至少你应该去掉字母s

另一个问题是,在调用fscanf之后,没有读取新的行字符'n'。因此,fscanf的下一次调用读取一个空字符串。

最好使用另一个C函数fgtes。但是你需要小心使用它。

通常,存储在输入文件中的字符串可以大于数组buffer的大小。

这意味着您需要使用不止一次fgets调用来读取输入文件中的一些字符串。否则会导致输出文件格式错误。

循环可以如下所示

int success = 1;
do
{
success = fgets( buffer, sizeof( buffer ), f ) != NULL;
if ( success )
{
int target = *buffer == usr;
if ( target ) fprintf( f2, "%s", buffer );
while ( success && !strchr( buffer, 'n' ) )
{ 
success = fgets( buffer, sizeof( buffer ), f ) != NULL;
if ( success && target ) fprintf( f2, "%s", buffer );
}
}
}  while ( success );

相关内容

  • 没有找到相关文章

最新更新