#include <stdio.h>int countKeyChar(char *buffer, char keyChar){int i;int cnt = 0;for(i=0; buffer[i] != '\0'; i++){if(buffer[i] = keyChar){cnt++;}}return cnt;}FILE *openFile(char *fileName, char *openMethod){FILE *fp;if(fp = fopen(fileName, openMethod) == NULL){printf("Cannot open file!\n");exit(0);}return fp;}void closeFile(FILE *fp){if(fp == NULL){printf("No file!\n");exit(0);}fclose(fp);}int getFileLength(FILE *fp){int len;fseek(fp, 0, SEEK_END); //將文件指針移到文件末尾len = ftell(fp);printf("%d.......",len);return len;}char *readData(FILE *fp, int n){int i;char *buffer;buffer = (char *)malloc(sizeof(char) * n + 1);for(i=0; i<n; i++){buffer[i] = fgetc(fp);}buffer[n] = '\0';return buffer;}int main(){FILE *fp; //文件指針char keyChar; //存放關鍵字符char *buffer; //指向存放文件數據的緩沖區char fileName[50]; //存放文件名int fileLen; //存放文件大小int cnt; //存放文件中關鍵字符的出現次數printf("Input file name: ");scanf("%s", fileName);getchar(); //消除上一行輸入末尾的回車printf("Input key character: ");scanf("%c", &keyChar);fp = openFile(fileName, "r");fileLen = getFileLength(fp); //計算文件字節數(即共有多少個字符)buffer = readData(fp, fileLen); cnt = countKeyChar(buffer, keyChar); printf("The number of \'%c\': %d\n", keyChar, cnt);free(buffer); //釋放緩沖區closeFile(fp);return 0;}
2 回答

慕妹3146593
TA貢獻1820條經驗 獲得超9個贊
Otherwise, -1 is returned and errno is set to indicate the error.
粗略看了一下,在你openFile函數實現里面有一句:
if(fp = fopen(fileName, openMethod) == NULL)
我記得 == 的優先級是比 = 要高的,右邊先判斷后不管是1還是0,對于fp來說都是個無用值,所以你在下面緊接著調用getFileLength(fp),ftell會報錯返回-1.

當年話下
TA貢獻1890條經驗 獲得超9個贊
#include <stdio.h> #include <stdlib.h> //最好加上這個頭文件,里面有malloc和free函數 int countKeyChar( char *buffer, char keyChar) { int i; int cnt = 0; for (i=0; buffer[i] != '\0' ; i++) { if (buffer[i] = keyChar) { cnt++; } } return cnt; } FILE *openFile( char *fileName, char *openMethod) { FILE *fp; if ((fp = fopen (fileName, openMethod)) == NULL) //這邊,用括號將fp = fopen括起來 { printf ( "Cannot open file!\n" ); return 0; } return fp; } void closeFile( FILE *fp) { if (fp == NULL) { printf ( "No file!\n" ); return ; } fclose (fp); } int getFileLength( FILE *fp) { int len; fseek (fp, 0, SEEK_END); len = ftell (fp); printf ( "%d......." ,len); return len; } char *readData( FILE *fp, int n) { int i; char *buffer; buffer = ( char *) malloc ( sizeof ( char ) * n + 1); for (i=0; i<n; i++) { buffer[i] = fgetc (fp); } buffer[n] = '\0' ; return buffer; } int main() { FILE *fp; char keyChar; char *buffer; char fileName[50]; int fileLen; int cnt; printf ( "Input file name: " ); scanf ( "%s" , fileName); getchar (); printf ( "Input key character: " ); scanf ( "%c" , &keyChar); fp = openFile(fileName, "r" ); fileLen = getFileLength(fp); buffer = readData(fp, fileLen); cnt = countKeyChar(buffer, keyChar); printf ( "The number of \'%c\': %d\n" , keyChar, cnt); free (buffer); closeFile(fp); system ( "pause" ); return 0; } |
你再試試,程序本身沒什么問題,修改后的代碼在vs2005中,可以獲取文件大小
- 2 回答
- 0 關注
- 81 瀏覽
添加回答
舉報
0/150
提交
取消