我正在嘗試列印從給定字母開始到第二個檔案的行,但它只列印 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, "%s\n", buffer);
return 0;
}
uj5u.com熱心網友回復:
第二次通過回圈,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);
uj5u.com熱心網友回復:
我不會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;
}
uj5u.com熱心網友回復:
對于初學者,呼叫中的格式字串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 );
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/487799.html
上一篇:禁止未使用的靜態函式的錯誤訊息?
下一篇:使用位掩碼從十進制轉換為基數4
