很多時候我們需要寫入數據到文件中時都覺得很困擾,因為格式亂七八槽的,可讀性太差了,
於是我們就想有沒有什么函數可以格式化的從文件中輸入和輸出呢,還真有。下面我將講解
一下fscanf和fprintf的強大之處。
1、fscanf(可以從一個文件流中格式化讀出數據,遇到空格或回車就停止)
原型: int fscanf(FILE *stream, const char *format, ...); //fscanf(文件流指針,格式字符串,輸出表列);
參數:
FILE *stream :文件流指針
const char *format, ... :字符串的格式
例子 :
fscanf(fp,"%s %s %d",new1->number,new1->staddress,&new1->price);(這樣寫的話數據輸入到文件中時每個數據中間就會有一個空格)
或者寫成:
fscanf(fp,"%s,%s,%d",new1->number,new1->staddress,&new1->price);(這樣寫的話數據輸入到文件中時每個數據中間就會有一個‘,’)
2、fprintf(可以向一個文件中格式化寫入數據)
原型: int fprintf(FILE *stream, const char *format, ...); //fprintf(文件流指針,格式字符串,輸出表列);
參數:
a、FILE *stream :文件流指針
b、const char *format, ... :字符串的格式
例子 :
fprintf(fp,"%s %s %d\n",new->number,new->staddress,new->price); //同上
或者寫成:
fprintf(fp,"%s,%s,%d\n",new->number,new->staddress,new->price); //同上
下面是代碼:
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h>
#define LENGTH 100 //數組的大小 typedef struct { char number[LENGTH]; char staddress[LENGTH]; int price; }*node,Node; int main(int argc,char *argv[]) { FILE *fp; fp = fopen("test.txt","a+"); //以讀寫的權限打開文件(如果文件不存在則創建)
if(fp == NULL) { perror("fopen"); exit(1); } node new,new1; //new用來存放寫入到文件中的數據,new1用來存放從文件中讀出的數據 //為兩個結構體指針分配空間
new = (node)malloc(sizeof(Node)); new1 = (node)malloc(sizeof(Node)); //清空
memset(new,0,sizeof(node)); memset(new1,0,sizeof(node)); strcpy(new->number,"20170816"); strcpy(new->staddress,"南寧"); new->price = 100; fprintf(fp,"%s %s %d\n",new->number,new->staddress,new->price); //格式化寫入數據到文件中
fseek(fp, 0, SEEK_SET); //文件指針重置,因為上面把數據寫入文件的時候已經把文件流指針定位到文件尾了,所以要重新定位到文件頭
fscanf(fp,"%s %s %d",new1->number,new1->staddress,&new1->price);//格式化從文件中讀出數據
printf("%s %s %d\n",new1->number,new1->staddress,new1->price); //釋放兩個結構體指針
free(new); free(new1); fclose(fp); //關閉文件
return 0; }
這是我在ubuntu上運行的結果:
屏幕上的輸出:
打開test.txt文件中的內容: