#2023-2024-1 20231408《計算機基礎與程序設計》第十四周學習總結
作業信息
| 這個作業屬于哪個課程 | <2023-2024-1-計算機基礎與程序設計> |
|---|---|
| 這個作業要求在哪里 | <2023-2024-1計算機基礎與程序設計第十四周作業> |
| 這個作業的目標 | <《C語言程序設計》第13章> |
| 作業正文 | http://www.rzrgm.cn/jfxyh061028/p/17937008 |
教材學習內容總結
- 文件的兩種類型:文本文件和二進制文件及兩種文件里變量占用內存的大小及特點(前者一個字節對應一個字符,后者一個字節不一定對應一個字符)的不同。
- 高級文件操作函數(緩沖型文件系統中的文件操作)包括
- 文件的打開和關閉:函數原型分別為
FILE *fopen(const char *filename,const char *mode);和int fclose(FILE *fp);。
fopen的作用:用于打開文件,并返回一個指向文件的指針。參數filename是要打開的文件名,參數mode指定文件的打開模式,例如"r"表示只讀,"w"表示寫入(若文件不存在則創建,若存在則清空),"a"表示追加等。
fclose的作用:用于關閉已打開的文件。關閉文件后,釋放文件指針所占用的資源。
- 文件的讀寫:有許多方式的讀寫方式,讀寫文件中的字符、讀寫文件中的字符串、按格式讀寫文件、按數據塊讀寫文件、文件的隨機讀寫等等。對應也有很多函數實現相應功能,如fgetc(),fgets(),fscanf(),fread(),fwrite()等。
注意:經常用
fp=fopen("filename","打開方式");
if(fp==NULL)
{
printf("Failure to open filename!"\n);
exit(0);
}
這樣的語句檢查文件打開成功與否。
3. 文件的位置定位
有fseek()和ftell()。
fseek:移動文件指針
- 函數原型:int fseek(FILE *stream, long offset, int whence);
- 作用:用于移動文件指針到指定位置。參數offset表示偏移量,whence表示相對位置,可以是SEEK_SET(從文件開頭開始計算偏移)、SEEK_CUR(從當前位置開始計算偏移)、SEEK_END(從文件末尾開始計算偏移)。
ftell:獲取文件指針位置 - 函數原型:long ftell(FILE *stream);
- 作用:用于獲取文件指針的當前位置,返回當前位置的偏移字節數。
教材學習中的問題和解決過程
- 問題1:文件讀寫操作失敗可能是什么情況?
- 解決:
-
文件不存在或無法打開:當指定的文件不存在或無法打開時,會導致文件讀寫操作失敗。
-
文件權限問題:如果文件沒有正確的讀寫權限,嘗試對其進行讀寫操作會失敗。
-
磁盤空間不足:如果磁盤空間不足,寫入文件時可能會失敗。
-
文件指針位置錯誤:在文件讀寫過程中,文件指針的位置不正確可能導致讀寫錯誤。
-
讀寫操作超出文件大小:嘗試在文件末尾寫入數據或者讀取超出文件大小的數據會導致錯誤。
-
操作系統或硬件故障:操作系統或硬件故障可能導致文件讀寫操作失敗。
- 問題2:文件指針有點模糊。
- 解決:文件指針是一個指向文件的指針,用于標識當前文件操作的位置。在C語言中,當我們打開一個文件時,系統會自動維護一個文件指針,用于跟蹤文件的當前位置。文件指針可以通過文件操作函數進行移動,以實現對文件的讀取和寫入操作。
舉例說明:
FILE *fp; // 定義文件指針
fp = fopen("example.txt", "r"); // 打開文件
fseek(fp, 0, SEEK_SET); // 將文件指針移動到文件開頭
代碼調試中的問題和解決過程
- 我寫的代碼
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
float a,area=0,step=0.0001;
int i;
scanf("%f",&a);
for(i=0; i<a; i+=step)
{
area+=step*sin(i);
}
printf("%.2f\n",area);
return 0;
}
運行時除了輸入0能輸出0外,輸入其他值均沒有輸出。
最后發現問題在于我在for后面的括號內讓i每次循環后加0.0001,這是一個浮點數,而i卻被我定義為整型,這會使得相加結果出錯。把i改為整型后就可以正常運行了。
2. 我寫的代碼(oj平臺上的CP1250)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int a,b,c,sum,number,abc,acb,bac,bca,cab,cba;
printf("Input a sum:");
scanf("%d",&sum);
for(a=1;a<=9;a++)
{
for(b=1;b<=9;b++)
{
for(c=1;c<=9;c++)
{
acb=a*100+c*10+b;
bac=b*100+a*10+c;
bca=b*100+c*10+a;
cab=c*100+a*10+b;
cba=c*100+b*10+a;
number=acb+bac+bca+cab+cba;
}
}
}
abc=a*100+b*10+c;
if(sum==number)
{
printf("The number is %d\n",abc);
}
else
{
printf("The sum you calculated is wrong!\n");
}
return 0;
}
運行時沒有按照預期輸出,比如我輸入1999,本來應該輸出The number is 443.而它輸出的是The sum you calculated is wrong!但是我的條件里明明寫的是如果sum==number,輸出443,為什么會輸出計算錯誤呢?后來我發現是因為犯了兩個錯誤:
- 一個是應該把if語句放到循環里,這樣才能把每一次循環得到的和number與sum比較,判斷是否相等,否則像我這樣,輸出的只會是把最后一次循環得到的結果與sum比較后的結果。
- 另一個是我應該增加一條退出語句,以保證在找到正確的值后及時退出循環,不再繼續比較以免輸出很多錯誤提示。
改正后,正確的代碼應該是
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int a,b,c,sum,number,abc,acb,bac,bca,cab,cba;
printf("Input a sum:");
scanf("%d",&sum);
for(a=1; a<=9; a++)
{
for(b=1; b<=9; b++)
{
for(c=1; c<=9; c++)
{
acb=a*100+c*10+b;
bac=b*100+a*10+c;
bca=b*100+c*10+a;
cab=c*100+a*10+b;
cba=c*100+b*10+a;
number=acb+bac+bca+cab+cba;
abc=a*100+b*10+c;
if(sum==number)
{
printf("The number is %d\n",abc);
return 0;
}
}
}
}
printf("The sum you calculated is wrong!\n");
return 0;
}
基于AI的學習
學習結果:
在緩沖型文件系統中,高級文件操作函數通常包括以下幾種:
- fopen:打開文件
- fclose:關閉文件
- fread:讀取文件
- fwrite:寫入文件
- fseek:移動文件指針
- ftell:獲取文件指針位置
- feof:檢查文件結束標記
- fflush:刷新文件緩沖區
fopen:打開文件
- 函數原型:FILE *fopen(const char *filename, const char *mode);
- 作用:用于打開文件,并返回一個指向文件的指針。參數filename是要打開的文件名,參數mode指定文件的打開模式,例如"r"表示只讀,"w"表示寫入(若文件不存在則創建,若存在則清空),"a"表示追加等。
fclose:關閉文件
- 函數原型:int fclose(FILE *stream);
- 作用:用于關閉已打開的文件。關閉文件后,釋放文件指針所占用的資源。
fread:讀取文件
- 函數原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
- 作用:從打開的文件中讀取數據,并將其存儲到ptr指向的內存中。參數size表示每個數據項的字節數,nmemb表示要讀取的數據項數量。
fwrite:寫入文件
- 函數原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
- 作用:將ptr指向的數據寫入到打開的文件中。參數size表示每個數據項的字節數,nmemb表示要寫入的數據項數量。
fseek:移動文件指針
- 函數原型:int fseek(FILE *stream, long offset, int whence);
- 作用:用于移動文件指針到指定位置。參數offset表示偏移量,whence表示相對位置,可以是SEEK_SET(從文件開頭開始計算偏移)、SEEK_CUR(從當前位置開始計算偏移)、SEEK_END(從文件末尾開始計算偏移)。
ftell:獲取文件指針位置
- 函數原型:long ftell(FILE *stream);
- 作用:用于獲取文件指針的當前位置,返回當前位置的偏移字節數。
feof:檢查文件結束標記
- 函數原型:int feof(FILE *stream);
- 作用:用于檢查文件結束標記。如果已經讀取到文件末尾,則返回非零值;否則返回0。
fflush:刷新文件緩沖區
- 函數原型:int fflush(FILE *stream);
- 作用:用于將緩沖區的數據立即寫入文件,而不是等到緩沖區滿或文件關閉時才寫入。
這些高級文件操作函數在緩沖型文件系統中提供了對文件的靈活操作,包括打開、關閉、讀取、寫入、定位文件指針等功能,為程序員提供了豐富的文件處理能力。
學習進度條
| 代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
|---|---|---|---|---|
| 目標 | 5000行 | 30篇 | 400小時 | 優秀 |
| 第一周 | 2/3 | 20/20 | 合格 | |
| 第二周 | 20/20 | 1/4 | 15/35 | 終于理解了一些概念,能看懂一些話了 |
| 第三周 | 20/40 | 1/5 | 20/55 | |
| 第四周 | 50 /90 | 2/7 | 20/75 | |
| 第五周 | 80/170 | 1/8 | 30/105 | 會編寫一些簡單程序了 |
| 第六周 | 30/200 | 2/10 | 30/135 | 編程水平提升了 |
| 第七周 | 30/230 | 1/11 | 25/160 | 編程得更熟,也知道了計算機方面更多粗淺的知識。 |
| 第八周 | 60/290 | 2/13 | 30/190 | 對于高級語言的一致性有了認識。 |
| 第九周 | 100/390 | 1/14 | 30/230 | |
| 第十周 | 100/490 | 2/16 | 30/260 | |
| 第十一周 | 150/640 | 2/18 | 30/290 | |
| 第十二周 | 200/840 | 1/19 | 30/320 | |
| 第十三周 | 200/1040 | 1/20 | 20/340 | |
| 第十四周 | 150/1190 | 1/21 | 20/360 |
浙公網安備 33010602011771號