主頁 > 軟體設計 > ??學懂C語言檔案操作讀這篇就夠了(萬字總結,附習題)??

??學懂C語言檔案操作讀這篇就夠了(萬字總結,附習題)??

2021-09-29 10:02:43 軟體設計

目錄

???

一,寫在前面

二,為什么使用檔案

1,原因

2,資料流

3,緩沖區(Buffer)

4,C語言中帶緩沖區的檔案處理

5,檔案型別

6,檔案存取方式

三,什么是檔案

1,程式檔案

2,資料檔案

3,檔案名

四,檔案的打開和關閉

1,檔案指標

2,檔案的打開和關閉

五,檔案的順序讀寫

1,功能

2,代碼實作

六,檔案的隨機讀寫

1,fseek

2,ftell

3,rewind

七,文本檔案和二進制檔案

八,檔案讀取結束的判定

1 被錯誤使用的feof

九,檔案緩沖區

十,習題

1,C語言檔案概念

2,檔案型別指標

3,檔案的打開與關閉

4,檔案的讀寫


一,寫在前面

本文是在學校和教學視頻下總結的自己億點點心得,文章篇幅有一點長,如果讀者想要更深入的了解C語言檔案操作,檔案操作在C語言中比較獨立,沒那么重要,建議上手練一練,學編程不練習,不敲代碼進步會很慢,(保姆級教學)最后,如果你感覺本文寫的不錯,求收藏,求點贊,求評論爆肝不易,你的三連是我學習最大的動力!!!

二,為什么使用檔案

1,原因

這就涉及到了資料持久化的問題,我們一般資料持久化的方法有,把資料存放在磁盤檔案、存放到資料 庫等方式, 使用檔案我們可以將資料直接存放在電腦的硬碟上,做到了資料的持久化,

2,資料流

指程式與資料的互動是以流的形式進行的,進行C語言檔案的存取時,都會先進行“打開檔案”操作,這個操作就是在打開資料流,而“關閉檔案”操作就是關閉資料流,

3,緩沖區(Buffer)

指在程式執行時,所提供的額外記憶體,可用來暫時存放做準備執行的資料,它的設定是為了提高存取效率,因為記憶體的存取速度比磁盤驅動器快得多,

4,C語言中帶緩沖區的檔案處理

C語言的檔案處理功能依據系統是否設定“緩沖區”分為兩種:一種是設定緩沖區,另一種是不設定緩沖區,由于不設定緩沖區的檔案處理方式,必須使用較低級的I/O函式(包含在頭檔案io.h和fcntl.h中)來直接對磁盤存取,這種方式的存取速度慢,并且由于不是C的標準函式,跨平臺操作時容易出問題,下面只介紹第一種處理方式,即設定緩沖區的檔案處理方式:

當使用標準I/O函式(包含在頭檔案stdio.h中)時,系統會自動設定緩沖區,并通過資料流來讀寫檔案,當進行檔案讀取時,不會直接對磁盤進行讀取,而是先打開資料流,將磁盤上的檔案資訊拷貝到緩沖區內,然后程式再從緩沖區中讀取所需資料,如下圖所示:

事實上,當寫入檔案時,并不會馬上寫入磁盤中,而是先寫入緩沖區,只有在緩沖區已滿或“關閉檔案”時,才會將資料寫入磁盤,如下圖所示,

5,檔案型別

分為文本檔案和二進制檔案兩種,

文本檔案是以字符編碼的方式進行保存的,二進制檔案將記憶體中資料原封不至檔案中,適用于非字符為主的資料,如果以記事本打開,只會看到一堆亂碼,

其實,除了文本檔案外,所有的資料都可以算是二進制檔案,二進制檔案的優點在于存取速度快,占用空間小,以及可隨機存取資料,

6,檔案存取方式

包括順序存取方式和隨機存取方式兩種,

順序讀取也就是從上往下,一筆一筆讀取檔案的內容,保存資料時,將資料附加在檔案的末尾,這種存取方式常用于文本檔案,而被存取的檔案則稱為順序檔案,

隨機存取方式多半以二進制檔案為主,它會以一個完整的單位來進行資料的讀取和寫入,通常以結構為單位,

三,什么是檔案

磁盤上的檔案是檔案, 但是在程式設計中,我們一般談的檔案有兩種:程式檔案、資料檔案(從檔案功能的角度來分類的),

1,程式檔案

包括源程式檔案(后綴為.c),目標檔案(windows環境后綴為.obj),可執行程式(windows環境 后綴為.exe),

2,資料檔案

檔案的內容不一定是程式,而是程式運行時讀寫的資料,比如程式運行需要從中讀取資料的文 件,或者輸出內容的檔案,

其實有時候我們會把資訊輸出到磁盤上,當需要的時候再從磁盤上把資料讀取到記憶體中使用,這里處理 的就是磁盤上檔案,

3,檔案名

一個檔案要有一個唯一的檔案標識,以便用戶識別和參考,

檔案名包含3部分:檔案路徑+檔案名主干+檔案后綴

例如: c:\code\test.txt

為了方便起見,檔案標識常被稱為檔案名,

四,檔案的打開和關閉

1,檔案指標

緩沖檔案系統中,關鍵的概念是“檔案型別指標”,簡稱“檔案指標”,

每個被使用的檔案都在記憶體中開辟了一個相應的檔案資訊區,用來存放檔案的相關資訊(如檔案的名 字,檔案狀態及檔案當前的位置等),這些資訊是保存在一個結構體變數中的,該結構體型別是有系統 宣告的,取名FILE.

例如,VS2013編譯環境提供的 stdio.h 頭檔案中有以下的檔案型別申明:

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
       };
typedef struct _iobuf FILE;

不同的C編譯器的FILE型別包含的內容不完全相同,但是大同小異,

每當打開一個檔案的時候,系統會根據檔案的情況自動創建一個FILE結構的變數,并填充其中的資訊, 使用者不必關心細節,

一般都是通過一個FILE的指標來維護這個FILE結構的變數,這樣使用起來更加方便,

下面我們可以創建一個FILE*的指標變數:

FILE* pf;//檔案指標變數

定義pf是一個指向FILE型別資料的指標變數,可以使pf指向某個檔案的檔案資訊區(是一個結構體變 量),通過該檔案資訊區中的資訊就能夠訪問該檔案,也就是說,通過檔案指標變數能夠找到與它關聯 的檔案,

2,檔案的打開和關閉

檔案在讀寫之前應該先打開檔案,在使用結束之后應該關閉檔案,

在撰寫程式的時候,在打開檔案的同時,都會回傳一個FILE*的指標變數指向該檔案,也相當于建立了 指標和檔案的關系,

ANSIC 規定使用fopen函式來打開檔案,fclose來關閉檔案,

//打開檔案
FILE * fopen ( const char * filename, const char * mode );
//關閉檔案
int fclose ( FILE * stream );
檔案使用方式 含義如果指定檔案不存在
“r”(只讀)為了輸入資料,打開一個已經存在的文本檔案出錯
“w”(只寫)為了輸出資料,打開一個文本檔案建立一個新的檔案
“a”(追加)向文本檔案尾添加資料出錯
“rb”(只讀)為了輸入資料,打開一個二進制檔案出錯
“wb”(只寫)為了輸出資料,打開一個二進制檔案建立一個新的檔案
“ab”(追加)為了輸出資料,打開一個二進制檔案出錯
“r+”(讀寫)為了讀和寫,打開一個文本檔案出錯
“w+”(讀寫)為了讀和寫,建議一個新的檔案建立一個新的檔案
“a+”(讀寫)打開一個檔案,在檔案尾進行讀寫建立一個新的檔案
“rb+”(讀寫)為了讀和寫打開一個二進制檔案出錯
“wb+”(讀寫)為了讀和寫,新建一個新的二進制檔案建立一個新的檔案
“ab+”(讀寫)打開一個二進制檔案,在檔案尾進行讀和寫建立一個新的檔案

五,檔案的順序讀寫

1,功能

功能函式名適用于
字符輸入函式fgetc所有輸入流
字符輸出函式fputc所有輸入流
文本行輸入函式gets所有輸入流
文本行輸出函式fputs所有輸入流
格式化輸入函式fscanf所有輸入流
格式化輸出函式fprintf所有輸入流
二進制輸入fread檔案
二進制輸出fwrite檔案

從流(fgetc、fgetwc)或stdin(fgetchar、fgetchar)中讀取字符

將字符寫入流(fputc,fputwc)或標準輸出(_fputchar,_fputwchar),

從stdin流中獲取一行,

將字串寫入流,

從流中讀取格式化資料,

將格式化資料列印到流,

從流中讀取資料,

將資料寫入流,

2,代碼實作

首先在桌面上創建一個321.txt檔案,如上圖

int main()
{
	//打開檔案
	FILE* pf = fopen("C:\\Users\\12556\\Desktop\\321.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}
	//讀檔案
	// 
	//關閉檔案
	fclose(pf);
	pf = NULL;

	return 0;
}

無錯誤,打開成功

int main()
{
	fputc('b', stdout);//putchar  printf("%c", ch);
	fputc('i', stdout);
	fputc('t', stdout);

	return 0;
}
int main()
{
	//打開檔案
	FILE* pf = fopen("C:\\Users\\12556\\Desktop\\321.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return -1;
	}
	
    //寫檔案
	fputc('b', pf);
	fputc('i', pf);
	fputc('t', pf);

	//關閉檔案
	fclose(pf);
	pf = NULL;

	return 0;
}

寫入成功

int main()
{
	FILE* pf = fopen("C:\\Users\\12556\\Desktop\\321.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	//讀檔案
	int ch = fgetc(pf);
	printf("%c\n", ch);//a

	ch = fgetc(pf);
	printf("%c\n", ch);//b

	ch = fgetc(pf);
	printf("%c\n", ch);//c

	//關閉檔案
	fclose(pf);
	pf = NULL;
	
	return 0;
}
int main()
{

	int ch = fgetc(stdin);//getchar scanf("%c")
	printf("%c\n", ch);//a
	ch = fgetc(stdin);
	printf("%c\n", ch);//b

	ch = fgetc(stdin);
	printf("%c\n", ch);//c

	return 0;
}

字串輸入成功

int main()
{
	FILE* pf = fopen("data.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	//寫檔案
	//寫一行資料
	fputs("hello world\n", pf);
	fputs("hello bit\n", pf);

	//關閉檔案
	fclose(pf);
	pf = NULL;
}

在C語言檔案下,我們找到data.txt檔案,打開發現輸入成功

int main()
{
	FILE* pf = fopen("data.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	//讀檔案
	//讀一行資料
	char arr[20] = { 0 };
	fgets(arr, 20, pf);
	printf("%s\n", arr);

	fgets(arr, 20, pf);
	printf("%s\n", arr);

	//關閉檔案
	fclose(pf);
	pf = NULL;
}

檔案閱讀成功

struct S
{
	int n;
	double d;
};

int main()
{
	struct S s = { 100, 3.14 };

	FILE* pf = fopen("data.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	//寫檔案
	fprintf(pf, "%d %lf", s.n, s.d);

	//關閉檔案
	fclose(pf);
	pf = NULL;
}

寫入成功

struct S
{
	int n;
	double d;
};
int main()
{
	struct S s = {0};
	FILE* pf = fopen("data.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	//讀檔案
	fscanf(pf, "%d %lf", &(s.n), &(s.d));

	printf("%d %lf\n", s.n, s.d);

	//關閉檔案
	fclose(pf);
	pf = NULL;
}

讀檔案成功

struct S
{
	int n;
	double d;
	char name[10];
};

int main()
{
	struct S s = {100, 3.14, "zhangsan"};

	FILE* pf = fopen("data.txt", "wb");
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	//寫檔案 - 二進制的方式寫
	fwrite(&s, sizeof(s), 1, pf);

	//關閉檔案
	fclose(pf);
	pf = NULL;
}

檔案格式不同,但計算機是以二進制表示

//二進制的形式讀
//
struct S
{
	int n;
	double d;
	char name[10];
};

int main()
{
	struct S s = {0};

	FILE* pf = fopen("data.txt", "rb");
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	//讀檔案 - 二進制的方式讀
	fread(&s, sizeof(struct S), 1, pf);

	//列印
	printf("%d %lf %s\n", s.n, s.d, s.name);
	//100 3.140000 zhangsan
	
	//關閉檔案
	fclose(pf);
	pf = NULL;
}

二進制閱讀成功

struct S
{
	int n;
	double d;
	char name[10];
};

int main()
{
	char arr[100] = { 0 };

	struct S tmp = { 0 };
	struct S s = { 100, 3.14, "zhangsan" };
	//把一個格式化的資料轉換成字串
	sprintf(arr, "%d %lf %s", s.n, s.d, s.name);
	//列印
	printf("%s\n", arr);
	
	//從arr中的字串中提取出一個格式化的資料
	sscanf(arr, "%d %lf %s", &(tmp.n), &(tmp.d), tmp.name);
	//列印
	printf("%d %lf %s\n", tmp.n, tmp.d, tmp.name);

	return 0;
}

格式化字串成功

六,檔案的隨機讀寫

在C語言檔案下創建data.txt.

添加abcdef

1,fseek

int fseek ( FILE * stream, long int offset, int origin );

根據檔案指標的位置和偏移量來定位檔案指標

int main()
{
	//打開檔案
	
	FILE *pf = fopen("data.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	//隨機讀寫
	/*int ch = fgetc(pf);
	printf("%c\n", ch);*/
	fseek(pf, 2, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	fseek(pf, -2, SEEK_CUR);
	
	fclose(pf);
	pf = NULL;
	return 0;
}

2,ftell

long int ftell ( FILE * stream );

回傳檔案指標相對于起始位置的偏移量


int main()
{
	//打開檔案

	FILE* pf = fopen("data.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	//隨機讀寫
	/*int ch = fgetc(pf);
	printf("%c\n", ch);*/
	fseek(pf, 2, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	fseek(pf, -2, SEEK_CUR);
	ch = fgetc(pf);
	printf("%c\n", ch);
	int ret = ftell(pf);
	printf("%c\n", ret);
	fclose(pf);
	pf = NULL;
	return 0;
}

3,rewind

void rewind ( FILE * stream );

讓檔案指標的位置回到檔案的起始位置

int main()
{
	//打開檔案

	FILE* pf = fopen("data.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return -1;
	}
	//隨機讀寫
	/*int ch = fgetc(pf);
	printf("%c\n", ch);*/
	fseek(pf, 2, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	fseek(pf, -2, SEEK_CUR);
	ch = fgetc(pf);
	printf("%c\n", ch);
	int ret = ftell(pf);
	printf("%c\n", ret);
	rewind(pf);
	printf("%c\n", ret);
	fclose(pf);
	pf = NULL;
	return 0;
}

七,文本檔案和二進制檔案

根據資料的組織形式,資料檔案被稱為文本檔案或者二進制檔案, 資料在記憶體中以二進制的形式存盤,如果不加轉換的輸出到外存,就是二進制檔案, 如果要求在外存上以ASCII碼的形式存盤,則需要在存盤前轉換,以ASCII字符的形式存盤的檔案就是文本檔案

一個資料在記憶體中是怎么存盤的呢? 字符一律以ASCII形式存盤,數值型資料既可以用ASCII形式存盤,也可以使用二進制形式存盤, 如有整數10000,如果以ASCII碼的形式輸出到磁盤,則磁盤中占用5個位元組(每個字符一個位元組),而 二進制形式輸出,則在磁盤上只占4個位元組(VS2019測驗),

在C語言檔案下創建321.txt

#include <stdio.h>
int main()
{
	int a = 10000;
	FILE* pf = fopen("321.txt", "wb");
	fwrite(&a, 4, 1, pf);//二進制的形式寫到檔案中
	fclose(pf);
	pf = NULL;
	return 0;
}

打開321.txt,發現無法識別,以二進制表現

我們在VS里面查找

16進制表示

八,檔案讀取結束的判定

1 被錯誤使用的feof

牢記:在檔案讀取程序中,不能用feof函式的回傳值直接用來判斷檔案的是否結束, 而是應用于當檔案讀取結束的時候,判斷是讀取失敗結束,還是遇到檔案尾結束

1. 文本檔案讀取是否結束,判斷回傳值是否為 EOF ( fgetc ),或者 NULL ( fgets )

例如: fgetc 判斷是否為 EOF . fgets 判斷回傳值是否為 NULL .

2. 二進制檔案的讀取結束判斷,判斷回傳值是否小于實際要讀的個數,

例如: fread判斷回傳值是否小于實際要讀的個數,

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	int c; // 注意:int,非char,要求處理EOF
	FILE* fp = fopen("test.txt", "r");
	if (!fp) {
		perror("File opening failed");
		return EXIT_FAILURE;
	}
	//fgetc 當讀取失敗的時候或者遇到檔案結束的時候,都會回傳EOF
	while ((c = fgetc(fp)) != EOF) // 標準C I/O讀取檔案回圈
	{
		putchar(c);
	}
	//判斷是什么原因結束的
	if (ferror(fp))
		puts("I/O error when reading");
	else if (feof(fp))
		puts("End of file reached successfully");
	fclose(fp);
}

以二進制檔案為例

#include <stdio.h>
enum { SIZE = 5 };
int main(void)
{
	double a[SIZE] = { 1.,2.,3.,4.,5. };
	FILE* fp = fopen("test.bin", "wb"); // 必須用二進制模式
	fwrite(a, sizeof * a, SIZE, fp); // 寫 double 的陣列
	fclose(fp);
	double b[SIZE];
	fp = fopen("test.bin", "rb");
	size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 讀 double 的陣列
	if (ret_code == SIZE) {
		puts("Array read successfully, contents: ");
		for (int n = 0; n < SIZE; ++n) printf("%f ", b[n]);
		putchar('\n');
	}
	else { // error handling
		if (feof(fp))
			printf("Error reading test.bin: unexpected end of file\n");
		else if (ferror(fp)) {
			perror("Error reading test.bin");
		}
	}
	fclose(fp);
}

feof的用途:是檔案讀取結束了,判斷是不是遇到檔案末尾而結束的

ferror的用途:檔案讀取結束了,判讀是不是遇到錯誤而結束

九,檔案緩沖區

ANSIC 標準采用“緩沖檔案系統”處理的資料檔案的,所謂緩沖檔案系統是指系統自動地在記憶體中為程式 中每一個正在使用的檔案開辟一塊“檔案緩沖區”,從記憶體向磁盤輸出資料會先送到記憶體中的緩沖區,裝 滿緩沖區后才一起送到磁盤上,如果從磁盤向計算機讀入資料,則從磁盤檔案中讀取資料輸入到記憶體緩 沖區(充滿緩沖區),然后再從緩沖區逐個地將資料送到程式資料區(程式變數等),緩沖區的大小根 據C編譯系統決定的,

#include <stdio.h>
#include <windows.h>
//VS2013 WIN10環境測驗
int main()
{
	FILE* pf = fopen("test.txt", "w");
	fputs("abcdef", pf);//先將代碼放在輸出緩沖區
	printf("睡眠10秒-已經寫資料了,打開test.txt檔案,發現檔案沒有內容\n");
	Sleep(10000);
	printf("重繪緩沖區\n");
	fflush(pf);//重繪緩沖區時,才將輸出緩沖區的資料寫到檔案(磁盤)
	//注:fflush 在高版本的VS上不能使用了
	printf("再睡眠10秒-此時,再次打開test.txt檔案,檔案有內容了\n");
	Sleep(10000);
	fclose(pf);
	//注:fclose在關閉檔案的時候,也會重繪緩沖區
	pf = NULL;
	return 0;
}

這里可以得出一個結論: 因為有緩沖區的存在,C語言在操作檔案的時候,需要做重繪緩沖區或者在檔案操作結束的時候關閉文 件, 如果不做,可能導致讀寫檔案的問題,

十,習題

1,C語言檔案概念

第1題:以下敘述中正確的是( ),

A、當對檔案的讀(寫)操作完成之后,必須將它關閉,否則可能導致資料丟失

B、打開一個已存在的檔案并進行了寫操作后,原有檔案中的全部資料必定被覆寫

C、在一個程式中當對檔案進行了寫操作后,必須先關閉該檔案然后再打開,才能讀到第1個資料

D、c語言中的檔案是流式檔案,因此只能順序存取資料

參考決議:【決議】B)選項中打開一個已存在的檔案并進行了寫操作后,原有檔案中的全部資料不一定被覆寫,也可以對源檔案進行追加操作等,C)選項中在一個程式中當對檔案進行了寫操作后,不用先關閉該檔案然后再打開,才能讀到第1個資料,可以用fseek()函式進行重新定位即可,D)選項中,c語言中的檔案可以進行隨機讀寫,

第2題:下列關于c語言檔案的敘述中正確的是
A、檔案由一系列資料依次排列組成,只能構成二進制檔案

B、檔案由結構序列組成,可以構成二進制檔案或文本檔案

C、檔案由資料序列組成,可以構成二進制檔案或文本檔案

D、檔案由字符序列組成,其型別只能是文本檔案

參考決議:【決議】本題考查檔案的概念,檔案是由資料序列組成,可以構成二進制檔案或文本檔案,所以答案為C選項,

第3題:下面選項中關于"檔案指標"概念的敘述正確的是
A、檔案指標是程式中用FILE定義的指標變數

B、檔案指標就是檔案位置指標,表示當前讀寫資料的位囂

C、檔案指標指向檔案在計算機中的存盤位置

D、把檔案指標傳給fscanf函式,就可以向文本檔案中寫入任意的字符

參考決議:【決議】在C語言中用一個指標變數指向一個檔案,這個指標稱為檔案指標,通過檔案指標就可對它所指的檔案進行各種操作,檔案指標不是檔案位置指標,所以BC選項錯誤,D選項中不可以寫入任意的字符,

第4題:以下選項中敘述正確的是
A、檔案指標是指標型別的變數

B、檔案指標可同時指向不同檔案

C、檔案指標的值是檔案在計算機磁盤中的路徑資訊

D、呼叫fscanf涵數可以向文本檔案中寫入任意字符

參考決議:【決議】所謂檔案指標,實際上是指向一個結構體型別的指標變數,這個結構體中包含有檔案的一些資訊,如緩沖區的地址,在緩沖區中當前存取的字符的位置,對檔案是“讀""還是“寫”,是否出錯,是否已經遇到檔案結束標志等資訊,檔案指釬本身是指標型別的變數,A選項正確,一個指釬在同一時間只能指向一個檔案,B選項錯誤,檔案指標是指標變數,存盤的是檔案快取區音地址,而不是檔案在計算機磁盤中的路徑資訊,C選項錯誤,fscanf函式從文本檔案中按格式讀入到程式中,而不是向文本檔案中寫入資料,D選項錯誤,

第5題:以下敘述正確的是
A、檔案指標是指標型別的變數

B、檔案指標變數的值是檔案的當前讀取位器

C、檔案指標變數的值是檔案的當前讀取位置

D、呼叫fscanf函丞|數能向所有型別的檔案中寫入任意字符

參考決議:【決議】檔案指標指向的是檔案緩沖區,而不是檔案本身位置,因此BC選項錯誤;fscanfi)函式作用是從指定的檔案中格式化讀資料,讀取資料型別由格式控制符決定,D選項錯誤,答案為A選項,

第6題:以下敘述正確的是
A、運算式sizeof(FILE*) == sizeof(int*)的值為真

B、檔案指標的值是一個整數,它的值一定小于檔案位元組數

C、檔案指標的值是所指檔案的當前讀取位置

D、使用fscanf函式可以向任意型別的檔案中寫入任意數量的字符

參考決議∶【決議】sizeof(FILE*)=4,因為file*為指標,指標的大小4,sizeof(int*)=4理由同前面,檔案指標的值是地址,是一個16進制的數,它的值不一定小于檔案位元組數,因此選項B錯誤,檔案指標是所指檔案的當前讀取位置,而不是檔案指標的值因此選項C錯誤,intfscanf(FILE*stream.constchar*format, [argument.]):
fscanf函式可以向任意型別的檔案,寫入任意數量不能超過系統的緩沖區,寫檔案先寫入緩沖區,最后一起寫入檔案,因此選項D錯誤,答案為A選項

第7題:以下關于c語言檔案的敘述中正確的是
A、檔案由資料序列組成,其型別可以為二進制檔案或文本檔案

B、檔案由記錄序列組成,其型別可以為二進制檔案或文本檔案

C、檔案由字符序列組成,其型別可以為二進制檔案或文本檔案

D、檔案由資料序列組成,其型別只能是二進制檔案

參考決議︰【決議】C語言檔案是指一組相關資料的有序集合,從檔案編碼的方式看,檔案可分為ASCII碼檔案和二進制檔案兩種,其中ASCII檔案也稱為文本檔案,所以檔案由資料序列組成,型別可以為二進制檔案或文本檔案,選項A正確,

2,檔案型別指標

第1題:以下敘述中正確的是(),
A、檔案指標是一種特殊的指標型別變數

B、檔案指標的值等于檔案當前讀寫位置,以位元組為單位

C、檔案指標的值等于檔案在計算機硬碟中的存盤位置

D、呼叫fscanf涵數只能向文本檔案中寫入任意字符

參考決議:【決議】檔案指標實際上是指向一個結構體型別的指標,這個結構體中包含有諸如:緩沖區的地址、在緩沖區中當前存取的字符的位置、對檔案是“讀"還是“寫”、是否出錯、是否已經遇到檔案結束標志等資訊,選項A正確,選項B、c錯誤;fscanf)函式只能從文本檔案中輸入資料到記憶體,選項D錯誤;本題答案為A,

第2題:下面說法正確的是(),
A、檔案指標的值是檔案的長度(以位元組為單位)

B、檔案指標的值是檔案名字串存放的首地址

C、檔案指標是指標型別的變數

D、fscanf函式可以向任意指定檔案中寫入任意指定字符

參考決議:【決議】檔案指標實際上是指向一個結構體型別的指標,這個結構體中包含有諸如:緩沖區的地址、在緩沖區中當前存取的字符的位置、對檔案是“讀還是“寫"、是否出錯、是否已經遇到檔案結束標志等資訊,選項C正確,選項A、B錯誤;fscanf()函式只能從文本檔案中輸入資料到記憶體,選項D錯誤;本題答案為C,

第3題:以下敘述中正確的是
A、C語言中的檔案是流式檔案,因此只能順序存取資料

B、打開一個已存在的檔案并進行了寫操作后,原有檔案中的全部資料必定被覆寫

C、在一個程式中,若對檔案進行了寫操作,則必須先關i閉該檔案然后再打開,才能讀到第1個資料

D、對檔案的讀(寫)操作后,必須將它關閉,否則可能會導致資料丟失

參考決議:【決議】在C語言中,有兩種對檔案的存取方式:順序存取和直接存取,如果以"a"”的方式對已打開的檔案進行寫操作后,則原檔案中內容將保存,新的資料寫在原有內容之后,如果以“a+”的方式為讀和寫操作而打開檔案,則可以對檔案進行讀/寫,而且在讀和寫操作之間不必關閉檔案,可以從買開始讀,當對檔案的讀(寫)操作完成之后,必須將它關閉,本題答案為D選項,

第4題:下面說法正確的是
A、檔案指標指向檔案當前正在處理的位元組地址

B、檔案指標變數中保存的是所指檔案包含的字符數

C、檔案指標變數中的值是個常量,不能修改

D、檔案指標變數的型別是FILE*

參考決議:【決議】在C語言中用一個指標變數指向一個檔案,這個指標稱為檔案指標,通過檔案指標就可對它所指的檔案進行各種操作,檔案指標變數的型別是FILE*,本題答案為D選項,

第5題:下面說法正確的是
A、檔案指標變數中保存的是檔案在硬碟上的位置資訊

B、檔案指標變數的型別是指標型別

C、檔案指標變數指向檔案名字串的記憶體地址

D、檔案指標指向檔案當前正在處理的位元組地址

參考決議:【決議】在C語言中用一個指標變數指向一個檔案,這個指標稱為檔案指標,通過檔案指標就可對它所指的檔案進行各種操作,這個指標是用來存放檔案的首地址,這個指標是專門用來指向檔案的,檔案指標變數的型別是指標型別,本題答案為B選項,

3,檔案的打開與關閉

第1題:設檔案指標fp已定義,執行陳述句fp=fopen("file" "w");后,以下針對文本檔案file操作敘述的選項中正確的是 第1題:設檔案指標FP已定義,執行陳述句fp=fopen(檔案“w”);后,以下針對文本檔案檔案操作敘述的選項中正確的是
A、只能寫不能讀 、只能寫不能讀

B、寫操作結束后可以從頭開始讀

C、可以在原有內容后追加寫

D、可以隨意讀和寫
參考決議:【決議】考查檔案操作函式fopen的基礎知識,以"w"方式打開檔案,只能寫不能讀,

第2題:以下關于fclose(fp)函式的敘述正確的是 第2題:以下關于flose(FP)函式的敘述正確的是
A、當程式中對檔案的所有寫操作完成之后,必須呼叫fclose(fp)函式關閉檔案

B、當程式中對檔案的所有寫操作完成之后,不一定要呼叫flose(FP)函式關閉檔案

C 、只有對檔案進行輸入操作之后,才需要呼叫flose(FP)函式關閉檔案

D、只有對檔案進行輸出操作之后,才能呼叫fclose(fp)函式關閉檔案

參考決議︰【決議】對一個檔案操作完成后,要將該檔案關閉,“關閉′就是使檔案指標變數不再指向該檔案,程式撰寫者應該在程式終止之前關閉所有檔案,如果不關閉,檔案將會丟失資料,因為,在向檔案寫資料時,是先將資料輸出到緩沖反,待緩沖區充滿后才正式輸出給檔案,如果當資料未充滿緩沖區而程式結束運行,就會將緩沖區中的資料丟失,用fclose函式關閉檔案,可以避免這個問題,它先把緩沖區中的資料輸出到磁盤檔案,然后才釋放檔案指標變數,所以對檔案的所有寫操作完成之后必須要關閉檔案,A選項正確,B選項錯誤,只要對檔案進行操作后,都要呼叫fclose檔案關閉檔案,C、D進項錯誤,

參考決議∶【決議】fopen函賽數以一定方式打開指定檔案,回傳一個指向檔案的檔案指標,如果不能實作打開指定檔案的操作,則回傳一個空指標NULL,如果指定檔案不存在則創建一個檔案名為指定檔案名的新檔案,然后打開它,在指定檔案有錯誤或者指定檔案不存在卻不能創建新檔案的情況下,打開檔案操作錯誤,回傳空指標,本題程式中,檔案test.txt不存在,但無其他例外,表示可以建立新檔案,命名為test.txt,C洗項敘述正確,并以只寫方式打開它,D選項敘述正確,回傳指向災件的指釬,if條件不成立,輸出“成功打開檔案!”,B選項敘述正確,A選項敘述錯誤,所以選擇A選項,

參考決議︰【決議】fopen函式以一定方式打開指定檔案,回傳一個指向檔案的檔案指標,如果不能實作打開指定檔案的操作,則回傳一個空指標NULL,如果指定檔案不存在則創建一個檔案名為指定檔案名的新檔案,然后打開它,在指定檔案有錯誤或者指定檔案不存在卻不能創建新檔案的情況下,打開檔案操作錯誤,回傳空指標,本題程式中,檔案test.txt不存在,但無其他例外,表示可以建立新檔案,命名為test.txt,C選項敘述正確,并以只寫方式打開它,D選項敘述正確,回傳指向檔案的指釬,if條件不成立,輸出“成功打開檔案!”,B選項敘述正確,A選項敘述錯誤,所以選擇A選項,

參考決議︰【決議】fopen函藥以一定方式打開指定檔案,回傳一個指向檔案的檔案指標,如果不能實作打開指定檔案的操作,則回傳一個空指標NULL,如果指定檔案不存在則創建一個檔案名為指定檔案名的新檔案,然后打開它,在指定檔案有錯誤或者指定檔案不存在卻不能創建新檔案的情況下,打開檔案操作錯誤,回傳空指標,本題程式中,檔案test.txt已存在,程式運行后,檔案test.txt中的原有內容將全部消失,A選項正確,檔案原本就存在,不會導致程式出錯,會按照指定的方式打開檔案,B選項錯誤,對檔案進行寫操作,只能對指標指向的位置內容進行寫操作,不能隨機讀寫,C選項錯誤,對檔案test.txt寫入的內容寫到指標所指向的位署,而不是添加在檔案尾部,D洗項錯誤,

4,檔案的讀寫

第1題:讀取二進制檔案的函式呼叫形式為:fread(buffer,size,count,fp);,其中buffer代表的是(), 第1題:讀取二進制檔案的函式呼叫形式為:Fread(緩沖區、大小、計數、FP);其中緩沖區代表的是(),
A、一個記憶體塊的位元組數 、一個記憶體塊的位元組數

B、一個整型變數,代表待讀取的資料的位元組數

C、一個檔案指標,指向待讀取的檔案

D、一個記憶體塊的首地址,代表讀入資料存放的地址

參考決議:【決議】fread(void *buffer,size t size,size t count,FILE *stream);功能是從一個檔案流中讀資料,讀取count個元素,每個元素size位元組,如果呼叫成功回傳count, 參考決議:[決議]Fread(void*緩沖區,大小t大小,大小t計數,檔案*流);功能是從一個檔案流中讀資料,讀取計數個元素,每個元素大小位元組,如果呼叫成功回傳計數,
buffer :用于接收資料的記憶體地址,大小至少是size*count位元組;size:單個元素的大小,單位是位元組; 緩沖區:用于接收資料的記憶體地址,大小至少是大小*計數位元組;大小:單個元素的大小,單位是位元組;
count:元素的個數,每個元素是size位元組;stream:輸入流, count:元素的個數,每個元素是size位元組;stream:輸入流,


參考決議:【決議】程式首先將陣列a[10]中的元素1、2、3分別寫入了檔案d1.dat檔案中,然后又將d1.dat檔案中的資料123,整體寫入到了變數n的空間中,所以列印n時輸出的資料為123,

參考決議:【決議】fprintf)函式向檔案輸出,將輸出的內容輸出到硬碟上的檔案或是相當于檔案的設備上執行兩次fnrint后檔案中有123 456,所以D選項正確,

參考決議:【決議】本題考查檔案操作函式,兩次fwrite后,p檔案中已經寫入1.2,3,0,0.1.2,3.0.0然后將檔案p中的內容重新寫入陣列a中,最后輸出a為1,2,3,0,0,1,2,3,0,0,所以選項D正確,

See You!!!!!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/303984.html

標籤:其他

上一篇:在 main 函式之前執行代碼(C 語言)

下一篇:C++類和物件(萬字總結)(建議收藏!!!)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more