C程式設計基礎day12

2021-08-22 07:27:16 字數 4071 閱讀 5846

\r 是每次輸出都在最左端。

fflush(stdout); 因為列印的時候不會立即放在螢幕,而是先放在記憶體,再放到快取區等到快取區滿了的時候才放在螢幕。呼叫這個函式後即便快取區沒滿也會將printf的內容顯示到螢幕上。 使用快取區是為了提高效率,避免太頻繁地從記憶體往螢幕寫東西,而是先把要顯示的東西存到快取區,等攢夠了再給螢幕。 讀取快取區類似。

檔案指標:file *fp;  //

所有平台的file名字都一樣,file是乙個結構體型別,裡面成員的功能一樣, 但是不同平台的結構體成員名字不一樣。

fp指標只要呼叫了fopen()函式,就會在堆區分配空間,然後將位址返回fp.

fp指標不是指向檔案,fp指標和檔案關聯,fp內部成員儲存了檔案狀態。  fp不是指向檔案(檔案在磁碟呢,沒法指),所以*fp不是檔案的內容. 別想通過*fp看檔案內容。

fp和檔案關聯的方法是給檔案分乙個檔案描述符,這個檔案描述符石file結構體的乙個成員。

操作fp指標,不能直接操作,必須通過庫函式來操作fp指標。 所以別想使用fp++或者*fp等操作。

通過庫函式操作指標,對檔案的任何操作,fp指標的指向的結構體內部成員都會有相應的變化(系統自動完成)。

檔案分為裝置檔案和磁碟檔案

磁碟檔案:通常儲存在外部介質(磁碟)上,使用時才調入記憶體。

裝置檔案:螢幕、鍵盤等與主機相連的裝置...把對他們的輸入輸出等同於對磁碟檔案的輸入輸出。stdout, stdin。

磁碟檔案又分為文字檔案和二進位制檔案

二進位制檔案:基於值編碼的檔案。

檔案操作實際上就3步驟。 

1、開啟檔案fopen()

2、讀寫檔案

2.1按字元讀寫fgetc()  fputc()

2.2按字串(行)讀寫fgets() fputs()

2.3檔案結尾的判斷feof()

3、關閉檔案fclose()

printf("aaaaaa\n");//可以列印

fclose(stdout);  //關閉標準輸出

printf("bbbbbb\n");//沒有列印出來,因為前一語句關閉了標準輸出。

perror("mike");//列印庫函式呼叫失敗的原因,函式引數必須是字串。

fclose(stderr); //關閉輸出標準出錯資訊

perror("wang");//無法列印,因為前一語句關閉了標準出粗。

int a =10;

fclose(stdin);//關閉標準輸入

scanf("%d",&a);//直接跳過這一步,無法輸入a的值,以為內前一語句關閉了標準輸入。

printf("a=%d\n",a);

若想使用printf往磁碟檔案中寫東西,要把標準輸出先關了,因為printf預設往標準輸出(1)中寫內容。

printf("before aaaaaa\n");//printf函式的內部實現往標準輸出(1)中寫內容

close(1); // 使用close而不是fclose是以為內close是系統呼叫,屬於作業系統介面。

int fd = open("01.txt",o_wronly,0777); // 使用open不是fopen, 返回值是返回最小可用的檔案描述值,所以返回1.

printf("fd =%d\n",fd); //在檔案中顯示返回值fd為1

printf("after aaaaaaa\n");//在檔案中顯示

windows下路徑寫法,兩個反斜槓\\因為反斜槓是轉義字元

fp = fopen("d:\\新建資料夾\\a.txt","w");

windows和linux都可用以下的形式

fp = fopen("d:/新建資料夾/a.txt","w");

當前路徑:

fp = fopen("a.txt","w");

fp = fopen("./a.txt","w");

相對路徑

fp = fopen("/home/edu/a.txt","w");

fopen會在堆區分配空間,返回位址給fp。fp指向file結構體。

相對路徑:

在linux環境下,相對路徑是指相對於可執行可執行程式。

在vs環境下,

a.編譯同時執行程式,相對路徑是相對於***.vcxproj所在路徑。

b.直接執行exe程式,相對路徑是相對於可執行程式。

在qt環境下,

a.編譯同時執行程式,相對路徑是相對於debug所在路徑。

b.直接執行exe程式,相對路徑是相對於可執行程式。

以下4種情況等價

fopen("1.txt","w");

char *p = 「1.txt」;

fopen(p,"w"); //p指向字串首元素位址

char p = 「1.txt」;

fopen(p,"w");//傳遞時是字串首元素位址

char *mode = 「1.txt」;

fopen("1.txt",mode);

fputc每次寫乙個字元到某個字元, putc和putc功能完全一樣,但是putc是巨集定義不是真正地函式呼叫。

fgetc從某個檔案讀取乙個字元,每讀取一次游標向右移一次。

1、如果是文字檔案可以通過-1(eof)來判斷是否檔案結尾。

2、如果是二進位制檔案就 不能通過-1判斷檔案結尾,因為二進位制檔案中可能有很多-1。

3、feof()判斷檔案是否結尾,任何檔案都能判斷。  feof是根據fp的檔案資訊判斷的,不是根據檔案內容返回值判斷的。

feof(fp)檔案結尾時返回true.

1、如果第一次沒有對檔案進行讀操作,直接呼叫此函式,永遠返回假(代表檔案沒有到結尾)。這裡的讀操作指的是fgetc等讀操作。

2、feof()函式必須先讀,再呼叫feof(),才有意義。 因為不讀的話,相當於沒有開始呢,怎麼判斷結束。

3、呼叫此函式,游標不會自動往後移動。  讀操作後游標才能往後移。

4、讀取後才能判斷是否結束,判斷的是已讀取的那個字元。

使用feof函式判斷結束的時候會讀取最後標誌結尾的那個-1,所以顯示讀取內容的時候最好在if(foef(fp))break;之後再顯示讀取內容。

int main(int argc,char *argv)該函式中int argc和argv兩個引數的理解你懂多少?

說明一下:argc命令列總的引數的個數,即argv中元素的格式。

* argv[ ]: 字串陣列,用來存放指向你的字串引數的指標陣列,每乙個元素指向乙個引數

argv[0]:指向程式的全路徑名

argv[1]:指向在dos命令列中執行程式名後的第乙個字串。

argv[2]:指向第二個字串。

舉例子執行程式   ./a.out 01.txt    中argv[0]是./a.out   argv[1]是01.txt

自己用c語言實現vi操作**如下所示。

fgets函式讀取,遇到換行符、檔案結尾、出錯時候,結束本次讀取。

char buf[100];

fgets(buf, sizeof(buf), fp);

為了避免讀取失敗的時候buf仍能列印buf中儲存的上次讀取的值,最好每次使用fgets函式之前先清空buf。

memset(buf, 0,sizeof(buf));

fgets(buf, sizeof(buf), fp);

函式可改動如下:

while(1)

fgets(buf,sizeof(buf),fp);//從fp往buf中讀內容,最多讀sizeof(buf)-1個。預設讀取到換行符\n或者檔案結尾,或者出錯,才結束本次讀取。

if(feof(fp)) //如果讀取失敗,直接跳出。

break;

printf("buf = %s",buf);//讀取成功則列印。

vs除錯中滑鼠點中某個巨集按f12可以看它定義的地方。

day12網路程式設計

day12網路程式設計 一,網路通訊協議 tcp ip協議中的四層分別是應用層 傳輸層 網路層和鏈路層,每層分別負責不同的通訊功能.鏈路層 鏈路層是用於定義物理傳輸通道,通常是對某些網路連線裝置的驅動協議,例如針對光纖 網線提供的驅動。網路層 網路層是整個tcp ip協議的核心,它主要用於將傳輸的資...

Python基礎刻意訓練 DAY12

學習內容 主要內容 模組 呼叫模組的方式 import 模組名 from 模組名 import 函式名 使用簡單的函式名 import 模組名 as 新名字 重新簡寫名字 最常用也是最簡單的方式 import turtle as tt 重新簡寫名字方便使用 tt.forward 20 ifname ...

C語言學習 day12

一 專題學習之陣列 一 陣列的基本概念 1 陣列是一組有序資料的集合,下表代表資料在陣列中的編號 2 用乙個陣列名 如s 和下標 如15 來唯一確定陣列中的元素 3 陣列中的每乙個元素都屬於同乙個資料型別。注 不能把不同的資料型別的資料放在同一陣列中,如 學生的成績和姓名。把陣列與迴圈結合起來可以有...