C語言程序設(shè)計應(yīng)用 練習與思考 題目及答案
《C語言程序設(shè)計應(yīng)用 練習與思考 題目及答案》由會員分享,可在線閱讀,更多相關(guān)《C語言程序設(shè)計應(yīng)用 練習與思考 題目及答案(13頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、練習與思考 9
填空題
假設(shè)在程序中有這樣一些語句:
#include
2、ose(__fp2__); /* 關(guān)閉文件test2.txt */ d) while(!__feof(fp1)__)fscanf(fp1, __”%c”__, __&ch__); /* 依次讀入文件中所有字符 */ e) nNumRead = fread(__str__,__sizeof(char)__, 1, fp1); f) fseek(fp1, __0L__, __SEEK_END/2__); /* 將文件內(nèi)部讀寫位置指針定位到文件尾*/ 1.2 選擇題 (1) 在C語言中對文件操作的一般步驟是( A )。 (A) 打開文件—操作文件—關(guān)閉文件 (B) 操作文
3、件—修改文件—關(guān)閉文件 (C) 讀寫文件—打開文件—關(guān)閉文件 (D) 讀文件—寫文件—關(guān)閉文件 (2) fscanf()函數(shù)的正確調(diào)用形式為( B )。 (A) fscanf(fp, 格式字符串, 讀入變量列表); (B) fscanf(文件指針, 格式字符串, 讀入變量列表); (C) fscanf(格式字符串, 文件指針, 讀入變量列表); (D) fscanf(格式字符串, 讀入變量列表, fp); (3) 已知函數(shù)的調(diào)用形式:fread(buffer, size, count, fp); 其中buffer代表的是( C )。 (
4、A) 一個整型變量,代表要讀入的數(shù)據(jù)項總數(shù) (B) 一個文件指針,指向要讀入的文件 (C) 一個指針,指向要存放讀入數(shù)據(jù)的地址 (D) 一個存儲區(qū),存放要讀入的數(shù)據(jù)項 (4) 以下可作為函數(shù)fopen中的第一參數(shù)的是( D )。 (C) "c:\user\text.txt" (D) "c:\\user\\text.txt" (5) 若執(zhí)行fopen函數(shù)發(fā)生錯誤,則函數(shù)的返回值是( B )。 (A) 地址值 (B) NULL (C) 1 (D) EOF (6) 函數(shù)調(diào)用語句:fseek(fp, -10L, 2
5、);的功能是( B )。 (A) 將文件內(nèi)部讀寫位置指針移到離當前位置10個字節(jié)處 (B) 將文件內(nèi)部讀寫位置指針移到文件尾前面10個字節(jié)處 (C) 將文件內(nèi)部讀寫位置指針移到文件頭后面10個字節(jié)處 (D) 將文件內(nèi)部讀寫位置指針移到文件尾后面10個字節(jié)處 (7) 函數(shù)fputc()調(diào)用成功時其返回值為( D )。 (A) EOF (B) 1 (C) 0 (D) 所寫入的字符 (8) 當打開的文件被成功關(guān)閉后,函數(shù)fclose()返回( B )。 (A) -1 (B) 0 (C) TRUE
6、 (D) 1 (9) 當文件內(nèi)部讀寫位置指針指向文件尾時,函數(shù)feof()返回( B )。 (A) EOF (B) 非零值 (C) 0 (D) NULL 1.3 簡答題 (1) 如果對fopen()函數(shù)的返回值不進行錯誤檢查,可能會出現(xiàn)什么后果?為了程序的可靠性,是否需要對程序中所有的文件操作函數(shù)調(diào)用進行錯誤檢查和處理? 答案要點:(1) 如果fopen()函數(shù)操作錯誤,沒有正確地按照指定方式打開文件,則后續(xù)所有文件操作均不能正確進行,程序會崩潰掉;(2) 因為文件操作的對象是外存上的文件,因此存在一定的偶然性,隨時可能會出錯,所以可靠的程序應(yīng)該對
7、所有文件操作進行檢查判斷其是否被正確執(zhí)行并預設(shè)有相應(yīng)的應(yīng)對措施。 (2) 以“a+”、“r+”、“w+”模式打開的文件都是可讀可寫的。哪種模式更適合用來改變文件中已有的內(nèi)容? 答案要點:相對來說,“r+”更適合用來改變文件中的內(nèi)容,“r+”方式打開時,文件內(nèi)部讀寫位置指針指向文件頭,可以通過文件隨機定位函數(shù)fseek()來把文件內(nèi)部讀寫位置指針移到指定位置修改文件內(nèi)容;而“a+”方式適合于給文件追加數(shù)據(jù),文件打開時文件內(nèi)部讀寫位置指針指向文件尾。當然“a+”方式也可以隨機定位修改文件內(nèi)容;而“w+”方式打開時,若文件已存在,則會破壞文件內(nèi)原有的所有內(nèi)容,因此不適合用來修改已有文件內(nèi)容。
8、
1.4 編程題
(1) 修改本章中程序清單9-3中,使之只用打開文件和關(guān)閉文件各1次。
程序清單 4-1
/*
purpose: Write and read string for file
author: Zhang Weigang
created: 2008/10/01 10:36:28
*/
#include
9、 int nResult, nLen; fp = fopen("hit.txt", "w+"); /* 創(chuàng)建文件并打開 */ if (NULL== fp) { printf("Open file hit.txt error\n"); exit(-1); } printf("Please input a string:\n"); gets(str); /* 獲取鍵盤輸入字符串 */ nLen = strlen(str); /* 計算字符串長度 */ nResult = fputs(str, fp); /*
10、把字符串寫入文件中 */ if(EOF == nResult) { printf("Write string to hit.txt error\n"); exit(-1); } printf("Write string to file completely\n"); fseek(fp, 0L, SEEK_SET); /* 文件內(nèi)部讀寫位置指針重新定位到文件頭 */ pCh = fgets(strNew, nLen+1, fp); /* 從文件中讀取字符串 */ if(NULL == pCh) { printf("Read s
11、tring from hit.txt error\n"); exit(-1); } puts(pCh); /* 輸出字符串到屏幕,此處也可把pCh替換成strNew */ fclose(fp); return 0; } (2) 編寫一個文件復制程序,要求從命令行參數(shù)中直接獲取源文件名和目的文件名。 程序清單 4-2 FileCopy.c /* purpose: Copy a file author: Zhang Weigang created: 2008/10/01 10:49:32 */ #include <
12、stdio.h>
#include
13、pSource = fopen(argv[1], "r"); /* 打開復制源文件 */ if (NULL== fpSource) { printf("Open source file error\n"); exit(-1); } fpDest = fopen(argv[2], "w"); /* 創(chuàng)建并打開復制目標文件 */ if (NULL== fpDest) { printf("Open destination file error\n"); exit(-1); } ch = fgetc(fpSource);
14、/* 從源文件中讀入字符 */ while(!feof(fpSource)) /* 判斷當前讀入字符是否為文件結(jié)束符 */ { fputc(ch, fpDest); /* 把當前字符寫入到目標文件中 */ nNum++; /* 統(tǒng)計復制字節(jié)數(shù) */ ch = fgetc(fpSource); } printf("Copied %d bytes.\n", nNum); printf("File Copy Successfully!\n"); fclose(fpSource); /* 關(guān)閉文件 */ fc
15、lose(fpDest);
return 0;
}
(3) 通過命令行參數(shù)給定2個文件的文件名,要求把第二個文件的內(nèi)容原封不動的寫入到第一個文件的尾部,并且不能破壞第一個文件原有數(shù)據(jù)。
程序清單 4-3 FileCat.c
/*
purpose: Append a file to another file
author: Zhang Weigang
created: 2008/10/01 11:29:42
*/
#include
16、r *argv[]) { FILE *fpSource, *fpDest; char ch; int nNum=0; printf("Append the second file to the first file.\n"); if(argc != 3) /* 判斷命令行參數(shù)輸入是否正確 */ { printf("Please use this program like:\n"); printf("FileCat SourceFileName DestinationFileName\n"); exit(-1); }
17、 fpDest = fopen(argv[1], "a+"); /* 以追加讀/寫方式打開第一個文件 */ if (NULL== fpDest) { printf("Open source file error\n"); exit(-1); } fpSource = fopen(argv[2], "r"); /* 以只讀方式打開第二個文件 */ if (NULL== fpSource) { printf("Open destination file error\n"); exit(-1); } ch = fgetc(fp
18、Source); /* 從源文件中讀入字符 */ while(!feof(fpSource)) /* 判斷當前讀入字符是否為文件結(jié)束符 */ { fputc(ch, fpDest); /* 把當前字符寫入到目標文件中 */ nNum++; /* 統(tǒng)計追加字節(jié)數(shù) */ ch = fgetc(fpSource); } printf("Appended %d bytes.\n", nNum); printf("File Append Successfully!\n"); fclose(fpDest);
19、/* 關(guān)閉文件 */
fclose(fpSource);
return 0;
}
(4) 給定一文本文件和一個字符,要求編程實現(xiàn)把該文件中包含有此指定字符的所有數(shù)據(jù)行打印出來并按原有樣式寫入到一個新的文本文件中保存起來。
程序清單 4-4 CharSearch.c
/*
purpose: Search a character in a file
author: Zhang Weigang
created: 2008/10/02 09:58:42
*/
#include
20、/* 功能: 從文件中讀取一行字符,存放到指定內(nèi)存區(qū)域 參數(shù): 文件指針fp,字符指針buffer 返回值:返回所讀取的文件行的字符數(shù) */ int readLine(FILE *fp, char *buffer) { char character; int i=0; do { character = fgetc(fp); /* 從文件中讀取單個字符 */ buffer[i]=character; /* 字符存放到緩沖區(qū)中 */ ++i; /* 計數(shù) */ }while (character!='\n'&& !
21、feof(fp)); /* 遇到換行符或文件結(jié)束符停止循環(huán) */ buffer[i-1]='\0'; /* 給buffer添加空字符構(gòu)成字符串 */ return (i-1); /* 返回所讀取的字符數(shù) */ } /* 功能: 在字符串中查找指定字符 參數(shù): 字符ch,字符指針buffer 返回值:若字符串中存在該字符,則返回1;否則返回0 */ int search(char ch, char *buffer) { int i = 0, result = 0; while('\0' != *(buffer+i)) /*
22、遇空字符停止循環(huán) */ { if(ch == *(buffer+i)) { result = 1; break; } i++; } return result; } int main(void) { FILE *fpSearch, *fpSave; char ch, filename[50], savename[50], buffer[500]; int nNum=0, line=0; printf("Please input the character that you want to search:\n"
23、); ch = getchar(); /* 輸入指定字符 */ getchar(); /* 消除"臟"回車符影響 */ printf("Please input the filename:\n"); gets(filename); /* 輸入文件名 */ printf("Please input the saveas filename:\n"); gets(savename); /* 輸入要另存為的文件名 */ fpSearch = fopen(filename, "r"); if (NULL== fp
24、Search) { printf("Open the search file error\n"); exit(-1); } fpSave = fopen(savename, "w+"); if (NULL== fpSave) { printf("Open the saveas file error\n"); exit(-1); } while(1) { nNum = readLine(fpSearch, buffer); /* 讀取文件內(nèi)的一行字符 */ if(0 == nNum) /* 若所讀取的字符
25、數(shù)為0,則說明已無文件行可讀,停止循環(huán) */ break; else { line++; if(search(ch, buffer)) /* 在字符串中查找指定字符 */ { printf("File Line %d: %d characters.\n", line, nNum); /* 輸出行號和所包含字符數(shù) */ printf("%s\n\n", buffer); /* 輸出所讀取的文件行字符串 */ fputs(buffer, fpSave); /* 把所讀取的文件行字符串寫入到另存為的文件只能夠 */
26、 fputc('\n', fpSave); /* 輸出換行符到另存為的文件中 */ } } } printf("File savaas Successfully!\n"); fclose(fpSearch); /* 關(guān)閉文件 */ fclose(fpSave); return 0; } (5) 編程統(tǒng)計一個文本文件中所包含的字母、數(shù)字和其他字符的個數(shù)。 程序清單 4-5 Stat.c /* purpose: Static character numbers in a file author: Z
27、hang Weigang
created: 2008/10/02 11:38:02
*/
#include
28、"r"); if (NULL== fp) { printf("Open the file error\n"); exit(-1); } do { ch = fgetc(fp); /* 讀取文件中字符 */ if((ch >= 'a' && ch <= 'z')||(ch >= 'A' && ch <= 'Z')) /* 字母 */ nCharNum++; else if((ch >= '0' && ch <= '9')) /* 數(shù)字 */ nDigitalNum++; else
29、/* 其他字符 */ nOtherNum++; }while(!feof(fp)); printf("------------------------------------\n"); /* 輸出結(jié)果 */ printf("Character static in file %s:\n", filename); printf("Characters: %d\n", nCharNum); printf("Digitals: %d\n", nDigitalNum); printf("Other: %d\n", nOtherNum); fclose(fp
30、); /* 關(guān)閉文件 */ return 0; } (6) 某個文本文件包含了若干家庭的所有家庭成員的年齡,其中同一個家庭所有成員的年齡都位于同一行,由單個空格分隔,家庭成員數(shù)不固定。例如,下面的數(shù)據(jù) 51 49 24 36 35 7 3 25 25 描述了三個家庭的成員年齡,其中第1個家庭有成員3個,第2個家庭有成員4個,第3個家庭有成員2個。 編寫一個程序,計算并輸出用這種文件表示的每個家庭所有成員的平均年齡。 提示:在文本文件中,回車換行符用‘\n’表示。應(yīng)該一行一行的從文件中讀出數(shù)據(jù)進行處理。 程序清單 4-6 Average.c
31、
/*
purpose: Calculate the average age for a file line
author: Zhang Weigang
created: 2008/10/02 11:48:36
*/
#include
32、 char character; int i=0; do { character = fgetc(fp); /* 從文件中讀取單個字符 */ buffer[i]=character; /* 字符存放到緩沖區(qū)中 */ ++i; /* 計數(shù) */ }while (character!='\n'&& !feof(fp)); /* 遇到換行符或文件結(jié)束符停止循環(huán) */ buffer[i-1]='\0'; /* 給buffer添加空字符構(gòu)成字符串 */ return (i-1); /* 返回所讀取的字符數(shù) *
33、/
}
/*
功能: 全數(shù)字字符串轉(zhuǎn)換為整數(shù)
參數(shù): 字符串長度len,字符指針str
返回值:返回轉(zhuǎn)換所得的整數(shù)
*/
int str2int(int len, char *str)
{
int i, num=0;
for(i=0; i 34、e(char *buffer)
{
int i=0, j;
int sum=0, num=0;
char tmp[10];
float result = 0.0;
while(1) /* 依據(jù)空格字符把字符串分割成只包含數(shù)字的子串 */
{
j=0;
do
{
tmp[j] = *(buffer+i);
j++;
i++;
}while(' '!=*(buffer+i) && '\0' != *(buffer+i));
tmp[j]='\0';
num++; /* 統(tǒng)計 35、家庭成員數(shù) */
sum += str2int(j, tmp); /* 把數(shù)字字串轉(zhuǎn)換成整數(shù)并進行年齡值累加 */
if('\0' == *(buffer+i)) /* 遇空字符停止循環(huán) */
break;
i++;
}
result = (float)sum/num; /* 計算平均年齡值 */
printf("Number of family member: %d\tSum of age: %d\n", num, sum);
return result;
}
int main(int argc, char * 36、argv[]) /* 通過命令行參數(shù)獲取文件名 */
{
FILE *fp;
char buffer[100];
int nNum=0, line=0;
if(argc != 2) /* 判斷命令行參數(shù)輸入是否正確 */
{
printf("Please use this program like:\n");
printf("Average FileName\n");
exit(-1);
}
fp = fopen(argv[1], "r");
if (NULL== fp)
{
printf("Op 37、en the age file error\n");
exit(-1);
}
while(1)
{
nNum = readLine(fp, buffer); /* 讀取文件內(nèi)的一行字符 */
if(0 == nNum) /* 若所讀取的字符數(shù)為0,則說明已無文件行可讀,停止循環(huán) */
break;
else
{
line++; /* 行號 */
printf("File Line %d: %s\n", line, buffer); /* 輸出行號和文件當前行字符串 */
printf("The 38、average age of this family is %.2f\n", average(buffer)); /* 輸出平均年齡值 */
printf("------------------------------------------\n");
}
}
fclose(fp); /* 關(guān)閉文件 */
return 0;
}
1.5 改錯題
(1) 下面的程序有哪些錯誤?怎樣改正?
int main()
{
int *fp;
int k;
fp = fopen("file");
for(k=0; k<30; k++) 39、
fputs(fp, "Beijing 2008");
fclose("file");
return 0;
}
答案:① int *fp; → FILE *fp; ② fopen(“file”); → fopen(“file”, “w+”);
③ fputs(fp, “Beijing 2008”); → fputs( “Beijing 2008”, fp); ④ fclose(“file”); → fclose(fp);
(2) 下面的程序代碼可能會出錯,請找出這個錯誤來并改在。該段代碼的功能是把文件中的所有小寫字母替換成對應(yīng)的大寫字母。
#include 40、o.h>
int main()
{
FILE *fp;
char ch;
fp = fopen("hit.txt", "r+");
if(NULL != fp)
{
while(fread(&ch, sizeof(char), 1, fp) == 1 && !feof(fp))
{
if(ch >= 'a' && ch <= 'z')
{
ch -= 32;
fseek(fp, -1L, SEEK_CUR);
fwrite(&ch, sizeof(char), 1, fp);
}
}
}
fclose(fp);
return 0;
}
提示:對于打開的同一個文件,在讀寫操作相繼進行時,必須在兩個操作之間插入fseek()函數(shù)的調(diào)用。
答案:在fwrite語句后插入語句fseek(fp, 0L, SEEK_CUR);
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版小學數(shù)學五年級下冊圖形的運動(三)-1課件
- 供應(yīng)鏈管理方法
- 2019最新青島版數(shù)學一年級上冊第三單元《走進花果山-10以內(nèi)的加減法》(信息窗6)課件
- 第四章勞動中的心理、生理狀態(tài)對安全的影響
- 201x九年級物理上冊-雙休作業(yè)八(新版)教科版課件
- 課件:項目一-電子商務(wù)物流系統(tǒng)規(guī)劃
- 【人教版】2012-2013學年九年級(全一冊)數(shù)學小復習:第27章相似復習課件
- 消化腺(全英文)課件
- 小學語文資源五年級上冊課件《落花生》課件第一課時
- 納米材料的基本效應(yīng)課件
- 分析化學概論-課件
- 沉浸式光影解決方案課件
- 第六講加固Windows操作系統(tǒng)安全ppt課件
- 民主選舉投出理性一票ppt課件
- 高二數(shù)學選修正態(tài)分布推薦實用全套PPT