設計思路:編程
關鍵是思路,首先知道 單詞, 行,字符, 他們有什麼特色: 一、單詞,標準的是遇到空格後,單詞數,自動加一。 二、行是以\n結束的, 也就是說, 遇到\n行數加一,固然也視你的操做系統而言。三、字符, 空格是否記在裏面? 等因素須要考慮。因此這就要求咱們將文件讀入,逐字檢測,檢測到空格單詞數加一,檢測到回車行數單詞數加一,若是既不是回車也不是空格則說明是字符,字符數加一 編程時發現的問題: 以上思路針對的是正常輸入的文本,實際輸入時還會出現種種特殊狀況。 1.在一行結束時(換行符以前)出現空格,也就是文本後面加一個空格再按回車,這種狀況會致使單詞數多1。 2.文本結束時沒有按下回車,會致使行數和單詞數少1。 3.連續出現幾個空格,也會致使單詞數增多。函數
在本次試驗中我在查資料是發現,由於不一樣的平臺對文本文件換行的處理不同,Linux以'\n'爲換行符,Windows以'\n\r'爲換行符,Mac又以'\r\n'爲換行符。因此,使用getc()函數處理換行時比較麻煩,因而我便學習網上」大牛「們,創建緩衝區,fgets()函數用於從文件中讀取一行或指定個數的字符,其原型爲:char * fgets(char *buffer, int size, FILE * stream);學習
因此在每一行便進行一次結果統計,最後,將結果統計相加。buffer爲緩衝區,用來保存讀取到的數據。size爲要讀取的字符的個數。若是該行字符數大於size-1,則讀到 size-1 個字符時結束,並在最後補充' \0';若是該行字符數小於等於 size-1,則讀取全部字符,並在最後補充 '\0'。即,每次最多讀取 size-1 個字符。讀取的字符包括換行符。stream爲文件指針。spa
首先是打開文件fopen(打開文件)相關函數open,fclose表頭文件#include<stdio.h>定義函數FILE * fopen(const char * path,const char * mode);參數path字符串包含欲打開的文件路徑及文件名,參數mode字符串則表明着流形態。
mode有下列幾種形態字符串:
r 打開只讀文件,該文件必須存在。
r+ 打開可讀寫的文件,該文件必須存在。
w 打開只寫文件,若文件存在則文件長度清爲0,即該文件內容會消失。若文件不存在則創建該文件操作系統
if( (fp=fopen(filename, "rb")) == NULL ){ perror(filename); return NULL; }
對於perror函數名 功 能: 系統錯誤信息 用 法: void perror(char *string);
程序例:.net
#include <stdio.h> int main(void) { FILE *fp; fp = fopen("perror.dat", "r"); if (!fp) perror("Unable to open file for reading"); return 0; }
在每一行便進行一次結果統計,最後,將結果統計相加。buffer爲緩衝區,用來保存讀取到的數據。size爲要讀取的字符的個數。若是該行字符數大於size-1,則讀到 size-1 個字符時結束,並在最後補充' \0';若是該行字符數小於等於 size-1,則讀取全部字符,並在最後補充 '\0'設計
for(i=0; i<len; i++){ c = buffer[i]; if( c==' ' || c=='\t'){ !blank && wNum++; blank = 1; }else if(c!='\n'&&c!='\r'){ cNum++; blank = 0; } }
對於不是空格單詞數+1指針
!blank && wNum++;
int c; c = getc(fp); while (c != EOF) { printf("%c", c); c = fgetc(fp); }
最後輸出
程序代碼已上傳至coding.netcode