我试图打印从给定字母到第二个文件开始的行,但它只打印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 );