資源簡介
對讀入的某個文本文件input.txt中,拆出英文單詞,輸出一個按字典順序排列的單詞表,結果輸出在文本文件output.txt中,每個單詞一行,并在單詞后輸出該單詞出現的個數,兩個字段之間用逗號分隔。約定單詞僅由英文字母組成,單詞間由非英文字母分隔,相同單詞只輸出一個,大小寫不區分。

代碼片段和文件信息
/*
?*?Copyright(C)?2011?Ruijie?Network.?All?rights?reserved.
?*/
/*
?*?file_operate.c
?*?Original?Author:??hgt@ruijie.com.cn?2011-3-3
?*
?*?與文件相關的操作函數模塊。該模塊中包含了文件打開,求文件
?*?長度,輸入字符串到文件,從文件中讀取單詞的操作。并且,
?*?這些操作都是安全的。
?*
?*?History
?*
?*/
#include?“file_operate.h“
/**
?*?安全的打開文件
?*?@fname:?文件名
?*?@attr:?文件打開時的屬性值
?*
?*?以指定的方式打開給定的名稱的文件。當文件不存在時,該函數會用給
?*?定的名稱以讀寫方式創建文件,并返回文件指針。
?*/
FILE*?file_open(?char*?fname?char*?attr?){
????FILE*?fp;
????fp?=?NULL;
????fp?=?fopen(?fname?attr?);
????if?(?fp?==?NULL?)?{ /*打開文件失敗*/
????????printf(“Arguments?error?!\n“);
????????printf(“System?will?create??file.\n“);
????????fp?=?fopen(?fname?“w+“?); /*新建文件*/
????????if?(?fp?==?NULL?)?{
????????????printf(“System?error!\n“);
????????????exit(?-1?);
????????}
????}
????return?fp;
}
/**
?*?獲得指定文件的長度
?*?@fp:?文件指針
?*
?*?獲得文件的長度,并返回。
?*/
long?file_lenght(?FILE*?fp?){
????long?length;
????long?locate;
????if?(?fp?==?NULL)?{
????????printf(“Arguments?error?!\n“);
????????return?-1;
????}
????locate?=?ftell(?fp?);???????????/*獲得文件指針的當前位置*/
????fseek(?fp?0L?SEEK_END?);??????/*將文件指針指向文件尾部*/
????length?=?ftell(?fp?);???????????/*獲得文件的長度*/
????fseek(?fp?locate?SEEK_SET?);??/*恢復文件指針的位置*/
????return?length;
}
/**
?*?輸入任意字符到指定的文件
?*?@fp:文件指針
?*
?*?從標準輸入中獲取字符,送到fp所指向的文件中
?*?按‘#’鍵結束輸入
?*/
void?input2file(?FILE*?fp?){
????char?ch;
????if?(?fp?==?NULL?)?{
????????printf(“Arguments?error!\n“);
????????return;
????}
????printf(“Enter?#?to?stop?input.\n“);
????while?(?(ch?=?getchar())?!=?‘#‘?)?{
????????fputc(?ch?fp?);
????}
????fseek(?fp?0L?SEEK_SET?);??????/*將文件指針重新指向文件頭*/
????return;
}
#define?BUFFER_LEN 512 /*單詞緩沖區增量*/
/**
?*?從給定的文件中讀取單詞
?*?@fp:文件指針
?*
?*?從指定的文件中讀取單詞,并返回。需要注意的是,
?*?返回單詞時,是以堆內存為載體的,所以需要在其他
?*?地方釋放,否則會造成內存泄露。
?*/
char*?read_word(?FILE*?fp?){
????char?ch;
????char*?word;
????int???buflen;
????int ??wordlen;
????MALLOC(?word?char?BUFFER_LEN?);???????????????????????????????/*申請單詞緩沖區*/
????buflen?=?BUFFER_LEN;
????wordlen?=?0;
????while?(?!feof(?fp?)?)?{
????????ch?=?fgetc(?fp?);
????????if?(?ch?>=?‘a‘&&?ch?<=?‘z‘?||?ch?>=?‘A‘&&?ch?<=?‘Z‘?)?{?????/*判斷是否是單詞的組成元素*/
????????????if?(?wordlen?>=?buflen?)?{??????????????????????????????/*如果單詞的長度大于緩沖區的大小,則需要擴大緩沖區大小*/
????????????????REALLOC(?word?char?(?buflen?+?BUFFER_LEN?)?);?????
????????????????buflen?+=?BUFFER_LEN;
????????????}
????????????word[wordlen++]?=?ch;
????????}?else?if?(?wordlen?>?0)?{??????????????????????????????????/*拼裝成功一個單詞,并返回*/
????????????word[wordlen]?=?‘\0‘;
????????????return?word;
????????}?else{?????????????????????????????????????????????????????/*未遇到有效字符*/
????????????continue;
????????}
????}
????if?(?wordlen?>?0?)?{
????????word[wordlen]?=?‘\0‘;
????????return?word;
????}?else?{
????????free(?word?);
????????return?(char*)0;
????}
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????3333??2011-03-05?12:02??hgt編碼練習\file_operate.c
?????文件????????441??2011-03-05?12:21??hgt編碼練習\file_operate.h
?????文件???????1323??2011-03-05?12:21??hgt編碼練習\main.c
?????文件????????258??2011-03-05?05:11??hgt編碼練習\makefile
?????文件????????592??2011-03-05?12:05??hgt編碼練習\memory.c
?????文件????????931??2011-03-05?12:21??hgt編碼練習\memory.h
?????文件???????5122??2011-03-05?12:21??hgt編碼練習\word_operate.c
?????文件????????505??2011-03-05?11:25??hgt編碼練習\word_operate.h
?????目錄??????????0??2011-03-05?12:21??hgt編碼練習
-----------?---------??----------?-----??----
????????????????12505????????????????????9
- 上一篇:一個簡單的LINUX防火墻
- 下一篇:CAN口助手CANtools
評論
共有 條評論