用VC 控制臺程序實現Word 的排版功能,,輸入文件名讀取小于64k 的英文文本, 然后對英文文本進行勻齊排版,,最后結果為:一行70個字符,,左右兩邊分別空 4 個字符,長單詞不能折斷,,每行必須對齊,,單詞中間插入空格。均勻插入,。
注意:1,、不能用STL庫,類似文件流fstream都不允許用 2,、不能用sdk,mfc,,windows api 3、用最基本的c/c++實現
從文件輸入輸出:
#include<stdio.h>
FILE *in,*out; in=fopen("a.txt","r"); //其意義是在當前目錄下打開文件a.txt,, 只允許進行“讀”操作,,并使in指向該文件。 out=fopen("aout.txt","w"); //打開aout.txt, 只能向該文件寫入數據, 如果不存在則創(chuàng)建aout.txt;
fscanf(in,"%d",&a); fprintf(out,"%d",a); fscanf(stdin,"%d",&a)=scanf("%d",&a); fclose(in); fclose(out);
文件使用方式 意 義
“rt” 只讀打開一個文本文件,,只允許讀數據 “wt” 只寫打開或建立一個文本文件,,只允許寫數據 “at” 追加打開一個文本文件,并在文件末尾寫數據 “rb” 只讀打開一個二進制文件,,只允許讀數據 “wb” 只寫打開或建立一個二進制文件,,只允許寫數據 “ab” 追加打開一個二進制文件,并在文件末尾寫數據 “rt+” 讀寫打開一個文本文件,,允許讀和寫 “wt+” 讀寫打開或建立一個文本文件,,允許讀寫 “at+” 讀寫打開一個文本文件,允許讀,,或在文件末追加數據 “rb+” 讀寫打開一個二進制文件,,允許讀和寫 “wb+” 讀寫打開或建立一個二進制文件,允許讀和寫 “ab+” 讀寫打開一個二進制文件,,允許讀,,或在文件末追加數據
對于文件使用方式有以下幾點說明:
1. 文件使用方式由r,w,a,t,b,+六個字符拼成,,各字符的含義是:
r(read): 讀 w(write): 寫 a(append): 追加 t(text): 文本文件,,可省略不寫 b(banary): 二進制文件 +: 讀和寫
2. 凡用“r”打開一個文件時,該文件必須已經存在, 且只能從該文件讀出,。
3. 用“w”打開的文件只能向該文件寫入,。 若打開的文件不存在,則以指定的文件名建立該文件,,若打開的文件已經存在,,則將該文件刪去,重建一個新文件,。
4. 若要向一個已存在的文件追加新的信息,,只能用“a ”方式打開文件。但此時該文件必須是存在的,,否則將會出錯,。
5. 在打開一個文件時,如果出錯,,fopen將返回一個空指針值NULL,。在程序中可以用這一信息來判別是否完成打開文件的工作,并作相應的處理,。因此常用以下程序段打開文件:
if((fp=fopen("c:\\hzk16","rb")==NULL) { printf("\nerror on open c:\\hzk16 file!"); getch(); //等待用戶敲入一個字符再運行 exit(1); }
* 字符讀寫函數 :fgetc和fputc
* 字符串讀寫函數:fgets和fputs
* 數據塊讀寫函數:freed和fwrite
* 格式化讀寫函數:fscanf和fprinf
一,、讀字符函數fgetc
[例10.1]讀入文件e10-1.c,在屏幕上輸出,。
#
include
<stdio.h> #include<iostream> void main() { FILE*fp; char ch; if((fp=fopen("input.txt","rt"))==NULL) { printf("Cannot open file strike any key exit!"); getchar(); exit(1); } ch=fgetc(fp);/* 在文件打開時,,文件內部位置指針總是指向文件的第一個字節(jié)。*/ while(ch!=EOF) { putchar(ch); ch=fgetc(fp); } printf("\n"); fclose(fp); }
|
二,、寫字符函數fputc
[例10.2]從鍵盤輸入一行字符,,寫入一個文件, 再把該文件內容讀出顯示在屏幕上,。
#
include
<stdio.h> #include<iostream> void main() { FILE*fp; char ch; if((fp=fopen("output.txt","wt+"))==NULL) { printf("Cannot open file strike any key exit!"); getchar(); exit(1); } printf("input a string:\n"); ch=getchar(); while(ch!='\n') { fputc(ch,fp); ch=getchar(); } rewind(fp);//將文件內部位置指針從末尾移向開頭;
ch=fgetc(fp); while(ch!=EOF) { putchar(ch); ch=fgetc(fp); } printf("\n"); fclose(fp); }
|
三,、 字符串讀寫函數fgets
fgets(str,n,fp); //從fp所指的文件中讀出n-1個字符送入字符數組str中, 末尾會自動加上'\0'。
[例10.4]從e10_1.c文件中讀入一個含10個字符的字符串,。
#
include
<stdio.h> #include<iostream> void main() { FILE*fp; char str[11]; if((fp=fopen("input.txt","rt"))==NULL) { printf("Cannot open file strike any key exit!"); getchar(); exit(1); } fgets(str,11,fp); printf("%s\n",str); fclose(fp); }
|
對fgets函數有兩點說明:
1. 在讀出n-1個字符之前,,如遇到了換行符或EOF,則讀出結束,。
2. fgets函數也有返回值,,其返回值是字符數組的首地址。
四,、寫字符串函數fputs
fputs("abcd",fp); //把字符串"abcd"寫入fp所指的文件之中
[例10.5]在例10.2中建立的文件string中追加一個字符串,。
#
include
<stdio.h> #include<iostream> void main() { FILE*fp; char ch, st[20]; if((fp=fopen("output.txt","at+"))==NULL) { printf("Cannot open file strike any key exit!"); getchar(); 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); }
|
五、數據塊讀寫函數fread和fwrite
fread(buffer,size,count,fp); fwrite(buffer,size,count,fp);
其中buffer是一個指針,,在fread函數中,,它表示存放輸入數據的首地址。在fwrite函數中,它表示存放輸出數據的首地址,。 size 表示數據塊的字節(jié)數。count 表示要讀寫的數據塊塊數,。fp 表示文件指針,。
fread(fa,4,5,fp); //其意義是從fp所指的文件中,每次讀4個字節(jié)(一個實數)送入實數組fa中,,連續(xù)讀5次,,即讀5個實數到fa中。
#
include
<stdio.h> struct stu { char name[10]; int num; int age; char addr[15]; }boya[2],boyb[2],*pp,*qq; main() { FILE*fp; char ch; int i; pp=boya; qq=boyb; if((fp=fopen("stu_list","wb+"))==NULL) { printf("Cannot open file strike any key exit!"); getch(); exit(1); } printf("\ninput data\n"); for(i=0;i<2;i++,pp++) scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr); pp=boya; fwrite(pp,sizeof(struct stu),2,fp); rewind(fp); fread(qq,sizeof(struct stu),2,fp); printf("\n\nname\tnumber age addr\n"); for(i=0;i<2;i++,qq++) printf("%s\t%5d%7d%s\n",qq->name,qq->num,qq->age,qq->addr); fclose(fp); }
|
六,、文件隨機讀寫:
rewind(文件指針),; //將文件內部位置指針置于開頭; fseek(文件指針,位移量,,起始點)
其中:“文件指針”指向被移動的文件,。 “位移量”表示移動的字節(jié)數,要求位移量是long型數據,,以便在文件長度大于64KB 時不會出錯,。 當用常量表示位移量時,要求加后綴“L”,?!捌鹗键c”表示從何處開始計算位移量,規(guī)定的起始點有三種:文件首,,當前位置和文件尾,。
起始點 表示符號 數字表示 ────────────────────────── 文件首 SEEK—SET 0 當前位置 SEEK—CUR 1 文件末尾 SEEK—END 2
fseek(fp,100L,0); //把位置指針移到離文件首100個字節(jié)處。
還要說明的是fseek函數一般用于二進制文件,。在文本文件中由于要進行轉換,,故往往計算的位置會出現錯誤。文件的隨機讀寫在移動位置指針 之后,, 即可用前面介紹的任一種讀寫函數進行讀寫,。
[例10.8]在學生文件stu list中讀出第二個學生的數據。
#
include
<stdio.h> struct stu { char name[10]; int num; int age; char addr[15]; }boy,*qq;
main() { FILE*fp; char ch; int i=1; qq=&boy; if((fp=fopen("stu_list","rb"))==NULL) { printf("Cannot open file strike any key exit!"); getch(); exit(1); } rewind(fp); fseek(fp,i*sizeof(struct stu),0); fread(qq,sizeof(struct stu),1,fp); printf("\n\nname\tnumber age addr\n"); printf("%s\t%5d %7d %s\n",qq->name,qq->num,qq->age,qq->addr); }
|
七,、文件檢測函數
C語言中常用的文件檢測函數有以下幾個,。
一、文件結束檢測函數feof函數調用格式: feof(文件指針),;
功能:判斷文件是否處于文件結束位置,,如文件結束,則返回值為1,,否則為0,。
二、讀寫文件出錯檢測函數ferror函數調用格式: ferror(文件指針);
功能:檢查文件在用各種輸入輸出函數進行讀寫時是否出錯,。 如ferror返回值為0表示未出錯,,否則表示有錯。
三,、文件出錯標志和文件結束標志置0函數clearerr函數調用格式: clearerr(文件指針);
功能:本函數用于清除出錯標志和文件結束標志,,使它們?yōu)?值。
八,、在附錄中給出了全部庫函數
ALLOC.H 說明內存管理函數(分配,、釋放等)。 ASSERT.H 定義 assert調試宏,。 BIOS.H 說明調用IBM—PC ROM BIOS子程序的各個函數,。 CONIO.H 說明調用DOS控制臺I/O子程序的各個函數。 CTYPE.H 包含有關字符分類及轉換的名類信息(如 isalpha和toascii等),。 DIR.H 包含有關目錄和路徑的結構,、宏定義和函數。 DOS.H 定義和說明MSDOS和8086調用的一些常量和函數,。 ERRON.H 定義錯誤代碼的助記符,。 FCNTL.H 定義在與open庫子程序連接時的符號常量。 FLOAT.H 包含有關浮點運算的一些參數和函數,。 GRAPHICS.H 說明有關圖形功能的各個函數,,圖形錯誤代碼的常量定義,正對不同
驅動程序的各種顏色值,,及函數用到的一些特殊結構,。 IO.H 包含低級I/O子程序的結構和說明。 LIMIT.H 包含各環(huán)境參數,、編譯時間限制,、數的范圍等信息。 MATH.H 說明數學運算函數,,還定了 HUGE VAL 宏,, 說明了matherr和matherr
子程序用到的特殊結構。 MEM.H 說明一些內存操作函數(其中大多數也在STRING.H 中說明),。 PROCESS.H 說明進程管理的各個函數,,spawn…和EXEC …函數的結構說明。 SETJMP.H 定義longjmp和setjmp函數用到的jmp buf類型,, 說明這兩個函數,。 SHARE.H 定義文件共享函數的參數。 SIGNAL.H 定義SIG[ZZ(Z] [ZZ)]IGN和SIG[ZZ(Z] [ZZ)]DFL常量,,說明rajse
和signal兩個函數,。 STDARG.H 定義讀函數參數表的宏,。(如vprintf,vscarf函數)。 STDDEF.H 定義一些公共數據類型和宏,。 STDIO.H 定義Kernighan和Ritchie在Unix System V 中定義的標準和擴展的
類型和宏,。還定義標準I/O 預定義流:stdin,stdout和stderr,說明
I/O流子程序,。 STDLIB.H 說明一些常用的子程序:轉換子程序,、搜索/ 排序子程序等。 STRING.H 說明一些串操作和內存操作函數,。 SYS\STAT.H 定義在打開和創(chuàng)建文件時用到的一些符號常量。 SYS\TYPES.H 說明ftime函數和timeb結構,。 SYS\TIME.H 定義時間的類型time[ZZ(Z] [ZZ)]t,。 TIME.H 定義時間轉換子程序asctime、localtime和gmtime的結構,,ctime,、
difftime、 gmtime,、 localtime和stime用到的類型,,并提供這些
函數的原型。 VALUE.H 定義一些重要常量,, 包括依賴于機器硬件的和為與Unix System V相兼
容而說明的一些常量,,包括浮點和雙精度值的范圍。
|