一道面試題引發的關於c語言中檔案操作的總結

2021-08-08 03:19:04 字數 4999 閱讀 4114

一、引言

請編寫程式:從鍵盤輸入乙個字串,將其中的小寫字母全部轉化為大寫在嗎,輸出到磁碟檔案「upper.txt"中儲存。輸入的字串以」!「結束。然後,再將檔案upper.txt中的內容讀出顯示在螢幕上。

初看此題覺得不是很難,寫**的時候發現自己久疏戰陣,很多檔案操作的用法有點生疏,下面我們來一一總結,搞清楚他們。

二、c語言檔案操作的函式

1、getchar()

2、putchar()

3、getc()

4、putc()

5、gets()

6、puts()

7、getch()

8、putch()

7、fgetchar()

8、fputchar()

9、fgetc()

10、fputc()

11、fgets()

12、fputs()

13、fread()

14、fwrite()

15、fscanf()

16、fprintf()

三、函式的用法

我們分別來說明以上函式的用法,輸入和輸出成對的來說明

1、getchar和putchar()

getchar() 和putchar()函式作用於輸入輸出流,分別是等待輸入流輸入字元,以及輸出流輸出字元;

getchar():等待鍵盤輸入字元,字元輸入後並不立即返回,而是將字元放置於緩衝區中,等待換行符,遇到換行符後函式返回,乙個字元乙個字元從緩衝區中讀取字元,直到從緩衝區讀完所有字元。

putchar(int _ch):該函式向輸出流來輸出乙個字元。

oid get_putcharfun()

return ;

}getc(file *file):如果是從標準輸入讀取字元則和getchar()沒有任何的區別,函式形式為getc(stdin);

看函式形式,我們還可以從檔案中讀取字元,每次讀取乙個字元,知道檔案末尾eof字元,在此處並不是以換行符作為終止符,而是檔案終止符;

putc(int _ch, file *fp):如果是向標準輸入讀取字元則和putchar()沒有任何的區別,函式形式為putc(ch,stdout);

看函式形式,我們還可以向檔案寫入字元,每次寫入乙個字元。

void get_putcfun()

*/ //測試檔案輸入輸出時的用法

char msg = "jkjkdjsaksksajksjksjclk%";

file *fp = fopen("file.txt", "at+");

if(fp == null)

char ch;

while((ch = getc(fp)) != eof)

int len = strlen(msg);

int i = 0;

while(len > 0)

fclose(fp);

return ;

}

3、getch()和putch()

這一對函式比較特殊,需要包含"conio.h"而不是"stdio.h"標頭檔案,兩個用法如下:

getch():給函式是等待標準鍵盤輸入,每次輸入乙個字元後就立即返回,且不進行回顯,即你在輸入介面時看不到你正在輸入的字元,

這點和getchar以及getc(stdin)有區別主要是以下方面:

* getchar()和getc(stdin)輸入時要進行回顯;

* getchar()和getc(stdin)輸入時並不是立即返回,等待換行符然後返回,getch()則是讀入到乙個字元後立即返回,並不是等待換行符的輸入。

putch(int _ch):該函式是向標準輸出輸入乙個字元和putchar和puc(ch,stout)並沒有什麼區別。

void get_putchfun()

return;

//getch();

}

4、gets()和puts()

gets函式時從標準輸入讀取一行,遇到換行符則返回,並且將換行符也讀入到字元緩衝區裡面;

puts()向標準輸出輸出一行資料,並且最後自動新增換行符。

void get_putsfun()

; gets(buffer);

puts(buffer);

}

5、fgetchar()和fputchar()

這兩個函式哈getchar和putchar並沒有任何區別,但是一般都是使用getchar和putchar進行操作;

void fget_fputcharfun()

6、fgetc和fputc

這兩個函式其實就是getc和putc中的輸入輸出檔案版本,例子如下:

void fget_fputcfun()

; file *fp = fopen("file.txt", "at+");

if(fp == null)

char ch;

while((ch = fgetc(fp))!=eof)

int len = strlen(msg);

int i = 0;

while(len > 0)

fclose(fp);

return;

}

七、fgets和fputs函式

fgets:從開啟的檔案中讀取一行,放入到緩衝區;

fputs:向開啟的檔案寫入一行資料。

**如下:

oid fgets_fputsfun()

while(fgets(buffer, sizeof(buffer), fp) != null)

fputs(outbuffer,fp);

fclose(fp);

return;

}

八、fread函式和fwrite函式

fread():

從檔案中讀取字元放到緩衝區中,

原型為:size_t fread(void *ptr, size_t size, size_t nmemb, file *stream);

size_t fwrite(const void *ptr, size_t size, size_t nmemb, file *stream); 

返回值:讀或寫的記錄數,成功時返回的記錄數等於nmemb,出錯或讀到檔案末尾時返回的記錄

數小於nmemb,也可能返回0。

如下面**進行測試

void fread_fwritefun()

; char writebuffer[1024] = ;

file *fp = fopen("file.txt", "r");

if(fp == null)

fseek(fp, 0, seek_end);

int lengths = ftell(fp);

fseek(fp,0,seek_set);

char *pbuffer = new char[lengths];

int len = fread(pbuffer,1 , lengths, fp);

pbuffer[len] = '\0';

if(len)

fclose(fp);

}void fwrite_fun()

char writebuffer[1024] = ;

fseek(fp, 0, seek_set);

int len = strlen(writebuffer);

int lengths = fwrite(writebuffer, 1, len, fp);

printf("file fp offset:%d\n", (int)ftell(fp));

fseek(fp, 0, seek_set);

fclose(fp);

}void printfun()

char ch;

while((ch = getc(fp)) != eof)

}

注意;在使用以上函式的時候要特別注意指標的是指向,以及指標的當前位置,否則很容易造成讀寫檔案時候的造成亂碼。

九、fscanf和fprintf函式

fscanf和fprintf函式主要是用來向檔案進行格式輸入輸出的函式,函式原型如下:

int fscanf(file *stream, char *format,[argument...])

int fprintf( file *stream, const char *format, [argument...];

void fprintffun()

; struct teststr ;

struct test tset[4] = ,,, };

struct teststr tsetstr[4] = ,,, };

char buffer[1024] = ;

file *fp = fopen("test.txt", "at+");

if (fp == null)

for (int i = 0; i < 4; i++)

fclose(fp);

}void fscanffun()

//fseek(fp, 0l, seek_set);

int number = 0;

float points = 0.0;

float extras = 0.0;

int last;

char str[16] = ;

//while (fscanf(fp, "%d,%d,%f,%f\n", &number, &last, &points, &extras) == 4)

// while (fscanf(fp, "%d,%d,%f,%s\n", &number, &last, &points, &str) == 4)

fclose(fp);

}

十、總結

檔案的操作不管是在c語言還是c++都是必須要掌握的基礎內容,再以後的學習中要多多的實踐。

一道面試題引發的pythonic

本文出自天外歸雲的 今天乙個朋友去面試,下面是一道測試工程師面試題 來自搜狗 自己寫了解法 coding utf 8 import redef filter log target,the log r target target dic for one in target target dic one...

一道面試題引發的思考

首先我們給出這道面試題的 以及題目 lista new arraylist list.add 1 list.add 2 for string item list 問 上段 執行會報錯嗎?如果把 1 換成 2 會報錯嗎?為什麼?首先給出答案 上面這段 執行不會報錯。把 1 換成 2 再執行就會報錯。為...

一道面試題引發的思考

好的面試官能夠能好的和面試者互動,而一場好的面試也能帶給面試者更多的思考 面試官給我出題後的 1 分鐘內,我給出了第一種思路 排序。將數字按公升序排序,去除最小的那個數即可。存在問題 時間複雜度高,只考慮了正數的情況。面試官給出了第一次提示時間複雜度過高,要求降低時間複雜度。於是在經過幾分鐘思考後,...