int fgetc(FILE *stream)
int fputc(int ch,FILE *stream)
fgetc( )函數從輸入流的當前位置返回一個字符,並將文件指針指示器移到下一個字符處,如果已到文件尾,函數返回EOF,此時表示本次操作結束,若讀寫文件完成,則應關閉文件。
fputc()函數完成將字符c h的值寫入所指定的流文件的當前位置處,並將文件指針后移一位。fputc()函數的返回值是所寫入字符的值,出錯時返回EOF。
int fscanf(FILE *stream,char *format,arg_list)
int fprintf(FILE *stream,char *format,arg_list)
對文件的格式化讀寫就是在上述函數的前面加一個字母f成為fscanf( )和fprintf( )
其中,stream為流文件指針,其余兩個參數與scanf( )和printf( )用法完全相同。
char *fgets(char *str,int num,FILE *stream) // 感覺是在讀一行數據
int fputs(char *str,FILE *stream)
fgets() 函數從流文件stream中讀取至多num-1個字符,並把它們放入str指向的字符數組中。讀取字符直到遇見回車符或EOF(文件結束符)為止,或讀入了所限定的字符數。
fputs( )函數將str指向的字符串寫入流文件。操作成功時,函數返回0值,失敗返回非零值。
int fread(void *buf,int size,int count,FILE *stream)
int fwrite(void *buf,int size,int count,FILE *stream)
fread()函數從stream 指向的流文件讀取count (字段數)個字段,每個字段為size(字段長度)個字符長,並把它們放到b u f(緩沖區)指向的字符數組中。
fread()函數返回實際已讀取的字段數。若函數調用時要求讀取的字段數超過文件存放的字段數,則出錯或已到文件尾,實際在操作時應注意檢測。
fwrite( )函數從buf(緩沖區)指向的字符數組中,把count(字段數)個字段寫到stream所指向的流中,每個字段為size個字符長,函數操作成功時返回所寫字段數。
關於成塊的文件讀寫,在創建文件時只能以二進制文件格式創建。
通常,對於輸入數據的格式較為復雜的話,我們可采取將各種格式的數據當做字符串輸入,然后將字符串轉換為所需的格式。C提供函數:
int atoi(char *ptr)
float atof(char *ptr)
long int atol(char *ptr)
它們分別將字符串轉換為整型、實型和長整型。使用時請將其包含的頭文件math.h或stdlib.h寫在程序的前面。
#include "stdafx.h"
#include <stdio.h>
// 將存放於磁盤的指定文本文件按讀寫字符方式逐個地從文件讀出,然后再將其顯示到屏幕上。
int main(int argc, char* argv[])
{
char ch;
FILE *fp;
int i;
if((fp=fopen(argv[1],"r"))==NULL) /* 打開一個由argv[1]所指的文件*/
{
printf("not open");
return 0;
}
while ((ch=fgetc(fp))!=EOF) /* 從文件讀一字符,顯示到屏幕*/ {
putchar(ch); // 如果同時打印 printf("(%d)",ch); putchar就不能正確顯示中文了
}
fclose(fp);
printf("Hello World!\n");
return 0;
}
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
// 向磁盤寫入字符串,並寫入文本文件test.txt:
int main(int argc, char* argv[])
{
FILE *fp;
char str[128];
if((fp=fopen("test.txt","w"))==NULL)
{
printf("not open");
return 0;
}
while((strlen(gets(str)))!=0) /*若串長度為零,則結束*/
{
fputs(str,fp); /*寫入串*/
fputs("\n",fp); /*寫入回車符*/
}
fclose(fp);
printf("Hello World!\n");
return 0;
}
#include "stdafx.h"
#include <stdio.h>
// 將一些格式化的數據寫入文本文件,再從該文件中以格式化方法讀出顯示到屏幕上,
// 其格式化數據是兩個學生記錄,包括姓名、學號、兩科成績。
int main(int argc, char* argv[])
{
FILE *fp;
int i;
struct stu{ /*定義結構體類型*/
char name[15];
char num[6];
float score[2];
} student; /*說明結構體變量*/
if((fp=fopen("test.txt","w"))==NULL) /*以文本只寫方式打開文件*/
{
printf("cannot open file");
return 0;
}
printf("input data:\n");
for( i=0;i<2;i++)
{
scanf("%s %s %f %f",student.name, student.num,
&student.score[0],
&student.score[1]); /*從鍵盤輸入*/
fprintf(fp,"%s %s %7.2f %7.2f\n", student.name, student.num,
student.score[0],
student.score[1]); /* 寫入文件*/
}
fclose(fp); /*關閉文件*/
if((fp=fopen("test.txt","r"))==NULL) /*以文本只讀方式重新打開文件*/
{
printf("cannot open file");
return 0;
}
printf("output from file:\n");
// fscanf 掃描的特點是,只按固定格式掃描,不管換行不換行。如果一行只掃描了一半,后面的數據下面接着掃描
while (fscanf(fp,"%s %s %f %f\n", student.name, student.num, &student.score[0], &student.score[1])!=EOF) /*從文件讀入*/ {
printf("%s %s %7.2f %7.2f\n", student.name, student.num, student.score[0], student.score[1]); /* 顯示到屏幕*/
}
fclose(fp); /*關閉文件*/
printf("Hello World!\n");
return 0;
}
#include "stdafx.h"
int main(int argc, char* argv[])
{
FILE *fp1;
int i;
struct stu{ /*定義結構體*/
char name[15];
char num[6];
float score[2];
} student;
if((fp1=fopen("test.txt","wb"))==NULL) /*以二進制只寫方式打開文件*/
{
printf("cannot open file");
return 0;
}
printf("input data:\n");
for( i=0;i<2;i++)
{
scanf("%s %s %f %f",student.name,student.num,&student.score[0],&student.score[1]); /* 輸入一記錄*/
fwrite(&student, sizeof(student), 1, fp1); /* 成塊寫入文件*/
}
fclose(fp1);
if((fp1=fopen("test.txt","rb"))==NULL) /*重新以二進制只寫打開文件*/
{
printf("cannot open file");
return 0;
}
printf("output from file:\n");
for (i=0;i<2;i++)
{
fread(&student,sizeof(student),1,fp1); /* 從文件成塊讀*/
printf("%s %s %7.2f %7.2f\n", student.name, student.num, student.score[0], student.score[1]); /* 顯示到屏幕*/
}
fclose(fp1);
printf("Hello World!\n");
return 0;
}
還有一個例子死活不行,請各位指教:
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
// 向磁盤寫入字符串,並寫入文本文件test.txt:
int main(int argc, char* argv[])
{
FILE *fp1,*fp2;
char str[128];
if ((fp1=fopen("test1.txt","r"))==NULL) /* 以只讀方式打開文件1 */
{
printf("cannot open file\n");
return 0;
}
if((fp2=fopen("test2.txt","w"))==NULL) /*以只寫方式打開文件2 */
{
printf("cannot open file\n");
return 0;
}
while ((strlen(fgets(str,128,fp1)))>0)
{
fputs(str,fp2); /* 從文件1讀字符串並寫入文件2 */
printf("%s",str); /*在屏幕顯示*/
}
fclose(fp1);
fclose(fp2);
}
