一、fputs()函數
fputs函數的功能是向指定的文件寫入一個字符串,其調用形式為: fputs(字符串,文件指針) 其中字符串可以是字符串常量,也可以是字符數組名, 或指針 變量,例如:
fputs(“abcd“,fp);
其意義是把字符串“abcd”寫入fp所指的文件之中。[例10.5]在例10.2中建立的文件string中追加一個字符串。
include
main()
{
FILE *fp;
char ch,st[20];
if((fp=fopen("string","at+"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
printf("input a string:/n");
scanf("%s",st);
fputs(st,fp);
rewind(fp);
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
printf("/n");
fclose(fp);
}
本例要求在string文件末加寫字符串,因此,在程序第6行以追加讀寫文本文件的方式打開文件string 。 然后輸入字符串, 並用fputs函數把該串寫入文件string。在程序15行用rewind函數把文件內部位置指針移到文件首。 再進入循環逐個顯示當前文件中的全部內容。
二、puts()函數和fputs()函數的區別
與 gets 函數一樣,對於 puts 函數,同樣建議使用 fputs 函數來代替 puts 函數。如下面的示例代碼所示:
int main(void)
{
char buffer[11];
fgets(buffer,11,stdin);
fputs(buffer,stdout);
return 0;
}
其中,puts 函數的原型如下所示:
int puts(const char *str);
我們知道,puts 函數主要用於向標准輸出設備(屏幕)寫入字符串並換行,即自動寫一個換行符(’\n’)到標准輸出。理論上,該函數的作用與“printf("%s\n",str);”語句相同。但是,puts 函數只能輸出字符串,不能進行相關的格式變換。與此同時,它需要遇到 null(’\0’) 字符才停止輸出。因此,非字符串或無 null(’\0’) 字符的字符數組最好不要使用該函數打印,否則無法正常結束。如下面的代碼所示:
int main(void)
{
char str[] = {'H','E','L','L','O'};
puts(str);
return 0;
}
在上面的示例代碼中,因為字符數組 str 在結尾處缺少一個 null(’\0’) 字符(也就是說它不是一個嚴格意義上的字符串)。因此,在調用 puts 函數的時候,程序將不知道什么時候停止輸出,從而導致輸出結果未定義。運行結果如下圖所示:
HELLO燙燙燙燙燙燙燙燙?口嶮?
正確的做法是應該在字符數組 str 的結尾處添加一個 null(’\0’) 字符,如下面的示例代碼所示:
char str[] = {'H','E','L','L','O','\0'};
fputs 函數
函數的函數原型如下所示:
int fputs(const char *str, FILE *stream);
相對於 puts 函數,fputs 函數用來向指定的文件寫入一個字符串(不換行)。當然,也可以使用 stdout 作為參數進行輸出顯示(它同樣需要遇到 null(’\0’) 字符才停止輸出),如下面的代碼所示:
int main(void)
{
char str[] = {'H','E','L','L','O','\0'};
fputs(str,stdout);
return 0;
}
運行結果如下:
HELLO
fputs主要功能
當然,fputs 函數主要用於對指定文件進行寫入操作,如下面的示例代碼所示:
int main(void)
{
FILE *fp=NULL;
fp=fopen("myfile.txt","wb");
if(fp == NULL)
{
printf("不能夠訪問該文件.\n");
exit(1);
}
fputs("this is a test", fp);
fclose(fp);
fp=NULL;
return 0;
}
運行上面的示例代碼,文件“myfile.txt”會被寫入一行“this is a test”字符串。
與 fgetws 一樣,C99 同樣也提供了 fputs 函數的寬字符版本 fputws,其函數的一般原型如下面的代碼所示:
int fputws(const wchar_t * restrict s, FILE * restrict stream);
參考書籍《C Primer Plus》(第六版中文版)
相關習題
1.設計並測試一個函數,從一行輸入中把一個單詞讀入一個數組中,並丟棄輸入行的其余字符。該函數應該跳過第一個非空白字符前面的所有空白。將一個單詞定義為沒有空白、制表符或換行符的字符序列。
運行結果如下:
2.設計並測試一個函數,它類似於編程練習1的描述,只不過他通過第二個參數指明可以讀取的最大字符數。
運行結果如下: