主頁 >  其他 > 【C語言進階】檔案資料操作詳解(萬字教你真正理解檔案使用)

【C語言進階】檔案資料操作詳解(萬字教你真正理解檔案使用)

2021-09-11 10:47:10 其他

檔案操作

目錄

??????一、我們為什么需要檔案?

二、究竟什么才是檔案

程式檔案

資料檔案

三、檔案名

四、檔案型別

五、檔案緩沖區

六、檔案指標

七、打開檔案和關閉檔案

fopen

fclose

八、檔案順序讀寫表

流(stream)

fputc

fgetc

fgets

fputs

fprintf

fscanf

對比一組函式

fwrite

fread

九、檔案隨機讀寫

fseek

ftell

rewind

十、檔案讀取結束的判定


一、我們為什么需要檔案?

由于我們之前所撰寫的程式在執行程序中所產生的資料及結果都只是臨時存放在記憶體區域,一旦程式運行結束后,該程式所開辟的記憶體空間將全部回傳給作業系統,那么此時我們再想要去查看之前的資料和執行結果,顯示是不可能的,

那該如何解決這個問題呢?

我們需要用到的就是——檔案, 沒錯,檔案 的作用就是可以將程式運行程序中所產生的資料結果都存盤下來,即便程式結束運行,我們依然可以通過 檔案 來找到這些資料,甚至再次運行程式時依然能使用這些資料,

二、究竟什么才是檔案

準確的來說:計算機檔案就是存盤在計算機硬碟、磁盤上的資訊集合,例如熟悉的圖片檔案、視頻檔案、程式等等,

檔案有各種各樣的型別,但是在程式設計中,我們一般談的檔案有兩種:程式檔案資料檔案

程式檔案

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


資料檔案

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

這次我們便圍繞資料檔案進行討論說明,

三、檔案名

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

檔案名包含3部分∶檔案路徑 + 檔案名主干 + 檔案后綴
例如︰ c : \code\text.txt
檔案路徑: c : \code
檔案名主干: test
檔案后綴: .txt

當然為了方便起見,檔案標識常被成為 檔案名,檔案名主干 的命名規則遵循識別符號的命名規則,

但是我們要了解此時所稱呼的檔案名,實際上包括以上3部分內容,而不僅僅是檔案名主干,

這邊我來舉例一些常見的檔案后綴方便大家去了解檔案的性質:

txt(文本檔案)dat(資料檔案)doc(Word生成的檔案)xlsx(excel生成的檔案)exe(可執行檔案)jpg(圖片檔案)等……

四、檔案型別

那么我們如何來區分檔案型別呢?

首先根據資料的組織形式,資料檔案被稱為了 文本檔案二進制檔案

而資料在記憶體中以二進制的形式存盤時,如果不加轉換的輸出到外存中去,那么就是 二進制檔案

反之,如果在外存上以ASCII碼的形式進行存盤,如果在存盤到外存前就轉換,那么就是 文本檔案


一個資料如何在記憶體中存盤的?

字符在記憶體中一律是以ASCII碼值形式進行存盤的,而數值型資料既可以用ASCII碼值形式存盤,也可以使用二進制形式進行存盤,

例:

#include <stdio.h>
int main()
{
    int a = 10000;
    FILE *pf = fopen("eg.txt", "wb");
    //fopen 打開名為test.txt的檔案 
    //wb 以二進制的形式寫入檔案
    fwrite(&a, 4, 1, pf);//寫一個四個位元組的資料放到以pf維護的檔案中去
    fclose(pf);
    pf = NULL;
    return 0;
}

我們以二進制編輯器打開我們所創建的 eg.txt 檔案中去:

我們可以看出這是以16進制形式顯示的,并且由于編譯器是按照小端進行存盤的,

所以應該為 00 00 27 10

轉換成二進制就是 00000000 00000000 00100111 00010000

圖解:

五、檔案緩沖區

我們來了解一下什么是檔案緩沖區:

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

圖解:

六、檔案指標

緩沖檔案系統中, 關鍵的概念是 “檔案型別指標” , 簡稱 “檔案指標” ,每個被使用的檔案都在記憶體中開辟一個相應的檔案資訊區,用來存放檔案的有關資訊(如檔案的名字、檔案狀態及檔案當前位置等),這些資訊是保存在一個結構體變數中的,
該結構體型別是由系統宣告的,取名為 FILE

例:

//vs2013編譯環境提供的stdio.h頭檔案的檔案型別申明
struct _iobuf
{
	char* _ptr;
	int  _cnt;
	char* _base;
	int  _f1ag;
	int  _file;
	int _charbuf;
	int _bufsiz;
	char* _tmpfname;
};
typedef struct _iobuf FILE;
  • 當然不同的C編輯器它所對應的FILE型別包含的內容也不完全相同,但從根本上大同小異,
  • 每當打開一個檔案時,系統會根據檔案的情況自動創建一個FILE結構的變數,并填充其中的資訊,使用時我們不必在意這些細節,
  • 一般情況下通過FILE指標來維護這個FILE結構的變數,這樣使用起來會更加便捷,


例:(創建FILE*的指標變數)

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

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

圖解:

七、打開檔案和關閉檔案

我們都知道,檔案在讀寫之前應該想先打開檔案,在使用結束后應該關閉檔案

在撰寫程式的時候,在打開檔案的同時,都會回傳一個 FILE* 的指標變數指向該檔案,也相當于建立了指標和檔案的關系,
ANSIC規定使用 fopen 函式來打開檔案,fclose 來關閉檔案,


fopen

//函式原型
FILE* fopen(const char* filename, const char* mode);

函式功能: Open a file.(打開檔案)
回傳型別: Each of these functions returns a pointer to the open file. A null pointer value indicates an error.(如果打開成功,回傳指向檔案資訊區的指標,如果回傳失敗,回傳空指標NULL)
函式引數1:filename(檔案名,實際上包括3部分內容,而不僅僅是檔案名主干,如果檔案路徑未寫,則默認本路徑)
函式引數2:Type of access permitted(檔案打開方式)

檔案打開方式表:

檔案使用方式含義如果指定檔案不存在
"r"(只讀)為了輸入資料,打開一個已經存在的文本檔案出錯
"w"(只寫)為了輸出資料,打開一個文本檔案建立一個新檔案
"a"(追加)向文本檔案尾添加資料出錯
"rb"(只讀)為了輸入資料,打開一個二進制檔案出錯
"wb"(只寫)為了輸出資料,打開一個文進制檔案建立一個新檔案
"ab"(追加)向一個二進制檔案尾添加資料出錯
"r+"(讀寫)為了讀和寫,打開一個文本檔案出錯
"w+"(讀寫)問了讀和寫,建立一個新的檔案建立一個新檔案

"a+"(讀寫)

打卡一個檔案,在檔案尾進行讀寫建立一個新檔案
"rb+"(讀寫)為了讀和寫打開一個二進制檔案出錯
"wb+"(讀寫)為了讀和寫,新建一個新的二進制檔案建立一個新檔案
"ab+"(讀寫)打開一個二進制檔案,在檔案尾進行讀和寫建立一個新檔案
注: ‘w’ 打開的時候如果有同名檔案,該檔案中的內容會被銷毀

fclose

//函式原型
int fclose(FILE* stream);

函式功能:Closes a stream(fclose) or closes all open streams(_fcloseall).(關閉檔案)
回傳型別:fclose returns 0 if the stream is successfully closed._fcloseall returns the total number of streams closed.Both functions return EOF to indicate an error(關閉檔案成功回傳0,關閉檔案失敗回傳EOF(值為 - 1)來報錯)
函式引數:Pointer to FILE structure(檔案指標)


例:

#include <stdio.h>
int main()
{
	//打開檔案mysize.txt
	//相對路徑
	//..表示上一級路徑
	//fopen("../../mysize.txt", "r");
	//.表示當前路徑
	FILE* pf = fopen("mysize.txt", "r");//相對路徑
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//打開成功
	//讀檔案
	fclose(pf);//關閉檔案
	return 0;
}

我們首先新建一個檔案:

執行結果:

我們此時再換成絕對路徑:


剛剛我們是以 “r”(只讀)的方式來打開檔案,現在我們來嘗試用 “w”(只寫)的方式來打開檔案

#include <stdio.h>
int main()
{

	FILE* pf = fopen("eg.dat", "w");//相對路徑
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//打開成功
	//讀檔案
	printf("file open success.\n");
	fclose(pf);//關閉檔案
	return 0;
}

觀察檔案夾,發現新建了 eg.dat 這么一個檔案 :

八、檔案順序讀寫表

名稱函式名功能(回傳值)
字符輸入函式fgetc(fp)

從檔案指標 fp 所指向的檔案的當前讀指標位置讀取一個字符,讀取完成后指標自動后移指向下一個字符

成功時回傳該字符,否則回傳EOF

字符輸出函式fputc(ch,fp)

將字符 ch 寫入到檔案指標 fp 所指向的檔案的當前寫指標位置

成功是回傳字符本身,否則回傳EOF

文本行輸入函式fgets(str, n, fp)fp 所指向的檔案的當前讀指標位置讀出 n 個字符放入字串 str 中成功時回傳該字串地址,否則回傳NULL
文本行輸出函式fputs(str, fp)

將字串 str 寫入到檔案指標 fp 所指向的檔案的當前寫指標位置

成功時回傳非0值,否則回傳EOF

格式化輸入函式fscanf(fp, 格式控制字串,地址串列)

格式控制串所描述的格式,從 fp 所指向的檔案中讀取資料,送到指定的變數中,

若輸出操作成功,回傳實際寫入的字符

若輸出操作失敗,則回傳EOF

格式化輸出函式fprintf(fp, 格式控制字串,輸出串列)

輸出項按照制定的格式寫入 fp 所指向的檔案中,

若輸入操作成功,回傳實際讀出的資料

若沒有讀到資料項,則回傳0

若檔案結束或呼叫失敗,則回傳EOF

二進制輸入size_t fread(buffer, size, count, stream)

讀取 [count_num] 個物件(每個物件大小為 size(大小) 指定的位元組數),并把它們替換到由 buffer (緩沖區) 指定的陣列,資料來自給出的輸入流

函式的回傳值是讀取的內容數量

二進制輸出size_t fwrite(buffer, size, count, stream)

buffer 所指向的陣列中的資料寫入到給定流 stream

若成功,該函式回傳一個 size_t 物件,表示元素的總數,該物件是一個整型資料型別,

若該數字與 count 引數不同,則會顯示一個錯誤,

單看這個表可能沒有什么感覺,接下去就讓我們來詳細的進行每個函式的功能描述,在此之前需要先介紹一個函式,它是什么呢?


流(stream)

概念:輸入輸出是資料傳送的程序, 資料如流水一樣從一處流向另一處, 因此常將輸入輸出形象地稱為流(stream), 即資料流,流表示了資訊從源到目的端的流動,在輸入操作時, 資料從檔案流向計算機記憶體, 在輸出操作時, 資料從計算機流向檔案(如列印機、磁盤檔案),檔案是由作業系統進行統一管理的, 無論是用Word打開或保存檔案, 還是C程式中的輸入輸出都是通過作業系統進行的,“流”是一個傳輸通道, 資料可以從運行環境(有關設備)流入程式中, 或從程式流至運行環境,

圖解:

注:C語言程式,只要運行起來,就默認打開了三個流,型別均為 FILE*
stdin --- 標準輸入流 --- 鍵盤
stdout --- 標準輸出流 --- 螢屏
stderr --- 標準錯誤流 --- 螢屏


fputc

例:

#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
	FILE* pf = fopen("mysize.txt", "w");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//寫檔案
	//關閉檔案
	fputc('H', stdout);//stdout 標準輸出流
	fputc('y', stdout);
	fputc('D', stdout);
	fputc('r', stdout);
	fputc('a', stdout);
	fclose(pf);

	return 0;
}

執行結果:


fgetc

例:

#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
	FILE *pf = fopen("mysize.txt","r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//讀檔案
	int ret = fgetc(pf);
	printf("%c", ret);
	ret = fgetc(pf);
	printf("%c", ret);
	ret = fgetc(pf);
	printf("%c", ret);
	ret = fgetc(pf);
	printf("%c", ret);
	ret = fgetc(pf);
	printf("%c", ret);
	//關閉檔案
	fclose(pf);
	pf = NULL;

	return 0;
}

執行結果:


fgets

在舉例前我們先在 mysize.txt 文本內部加上一行字符,這樣能夠更好的展現效果:

例:

#include <stdio.h>
int main()
{
	char buf[1024] = { 0 };
	FILE *pf = fopen("mysize.txt", "r");
	if (pf == NULL)
	{
		return 0;
	}
	//讀檔案
	fgets(buf, 1024, pf);
	printf("%s", buf);//buffer自身擁有換行功能

	fclose(pf);
	pf = NULL;
	return 0;
}

執行結果:


fputs

例1:

#include <stdio.h>
int main()
{
	char buf[1024] = { 0 };
	FILE *pf = fopen("mysize.txt", "r");
	if (pf == NULL)
	{
		return 0;
	}
	//讀檔案
	fgets(buf, 1024, pf);
	puts(buf);
	fgets(buf, 1024, pf);
	puts(buf);

	fclose(pf);
	pf = NULL;
	return 0;
}

執行結果:

例2:

#include <stdio.h>
int main()
{	
	//從鍵盤讀取一行文本資訊
	char buf[1024] = { 0 };

	fgets(buf, 1024, stdin);//從標準輸入流讀取
	fputs(buf, stdout);
	//上面那種寫法等價于下面這種寫法
	gets(buf);
	puts(buf);

	return 0;
}

fprintf

例:

#include <stdio.h>
struct S
{
	int n;
	float f;
	char arr[10];
};
int main()
{
	struct S s = { 520, 13.14f, "HSS" };
	FILE *pf = fopen("mysize.txt", "w");
	if (pf == NULL)
	{
		return 0;
	}
	//格式化的形式寫檔案
	fprintf(pf, "%d %f %s", s.n, s.f, s.arr);
	fclose(pf);//關閉檔案
	pf = NULL;

	return 0;
}

執行結果:

此時我們再去查看 mysize.txt 記事本就會發現里面的資料已經被格式化并且替換成了剛寫的資料:


fscanf

例:

#include <stdio.h>
struct S
{
	int n;
	float f;
	char arr[10];
};
int main()
{
	struct S s = { 0 };
	FILE* pf = fopen("mysize.txt", "r");
	if (pf == NULL)
	{
		return 0;
	}
	//格式化的輸入資料
	fscanf(pf, "%d %f %s", &(s.n), &(s.f), s.arr);
	printf("%d %f %s\n", s.n, s.f, s.arr);
	fclose(pf);//關閉檔案
	pf = NULL;	
	return 0;
}

執行結果:


對比一組函式

scanf / fscanf / sscanf
printf / fprintf / sprintf

此時我們還未了解過 sscanfsprintf,所以我們先進行舉例說明:

例:

#include <stdio.h>
struct S
{
	int n;
	float f;
	char arr[10];
};
int main()
{
	struct S s = { 520, 13.14f, "HSS" };
	struct S tmp = { 0 };
	char buf[1024] = { 0 };
	//把格式化的資料轉換成字串存盤到buffer
	sprintf(buf, "%d %f %s", s.n, s.f, s.arr);
	//從buffer中讀取格式化的資料到tmp中
	sscanf(buf, "%d %f %s", &(tmp.n), &(tmp.f), tmp.arr);
	printf("%d %f %s\n", tmp.n, tmp.f, tmp.arr);
	return 0;
}

執行結果:

總結:

  • scanf/printf --- 是針對標準輸入流/標準輸出流的格式化輸入/輸出陳述句
  • fscanf/fprintf --- 是針對所有輸入流/所有輸出流的格式化輸入/輸出陳述句
  • sscanf/sprintf --- sscanf是從字串中讀取格式化的資料,sprintf是把格式化資料輸出成(存盤到)字串


fwrite

例:

#include <stdio.h>
struct S
{
	char name[20];
	int age;
	int height;
};
int main()
{
	struct S s = {"HyDra", 18, 185};
	FILE *pf = fopen("mysize.txt", "wb");
	if (pf == NULL)
	{
		return 0;
	}
	//二進制的形式寫檔案
	fwrite(&s, sizeof(struct S), 1, pf);

	fclose(pf);
	pf = NULL;
	return 0;
}

執行結果:

為什么執行完里面是空白的呢?此時我們再看向 mysize.txt 檔案:

為什么后面的內容就變成亂碼了呢?

原因很簡單,由于 fwrite 的功能的就是進行二進制的輸出來進行存盤,所以當我們打開記事本時,由于HyDra是一個字串,所以我們是可以看到的,但是記事本沒有辦法轉換字符成為二進制,于是后面就成了亂碼,


fread

例:

struct S
{
	char name[20];
	int age;
	int height;
};
int main()
{
	struct S tmp = { 0 };
	FILE *pf = fopen("mysize.txt", "rb");
	if (pf == NULL)
	{
		return 0;
	}
	//二進制的形式寫檔案
	fread(&tmp, sizeof(struct S), 1, pf);
	printf("%s %d %d\n", tmp.name, tmp.age, tmp.height);
	fclose(pf);
	pf = NULL;
	return 0;
}

執行結果:

九、檔案隨機讀寫

一般情況下, 在對字符檔案進行順序讀寫時, 檔案位置標記指向檔案開頭, 這時如果對檔案進行讀的操作, 就讀第1個字符, 然后檔案位置標記向后移一個位置, 在下一次執行讀的操作時, 就將位置標記指向的第⒉個字符讀入,依此類推, 遇到檔案尾結束,

圖解:

當然也可以根據讀寫的需要, 人為地移動檔案位置標記的位置,
檔案位置標記可以向前移、向后移, 移到檔案頭或檔案尾, 然后對該位置進行讀寫,
顯然這就不是順序讀寫了, 而是隨機讀寫,


fseek

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

//函式原型
int fseek ( FILE * stream, long int offset, int origin );
//fseek(檔案型別指標, 偏移量, 起始點)

起始點的選項有三個:SEEK_CURSEEK_ENDSEEK_SET

起始點名字用數字代表
檔案開始位置SEEK_CUR0
檔案當前位置SEEK_END1
檔案末尾位置SEEK_SET2

例:

先打開mysize.txt編輯一下里面的的資料內容:

代碼如下:

#include <stdio.h>
int main()
{
	FILE *pf = fopen("mysize.txt", "r");
	if (pf == NULL)
	{
		return 0;
	}
	//1.定位檔案指標
	fseek(pf, 2, SEEK_CUR);
	//2,讀取檔案
	int tmp = fgetc(pf);
	printf("%c\n", tmp);

	fclose(pf);
	pf = NULL;
	return 0;
}

執行結果:

偏移量2,從開頭H向右偏移兩個到D(原HyDra)


ftell

  • 回傳檔案指標相對于起始位置的偏移量(定位)
//函式原型
long int ftell ( FILE * stream );

例:

#include <stdio.h>
int main()
{
	FILE *pf = fopen("mysize.txt", "r");
	if (pf == NULL)
	{
		return 0;
	}
	//1.定位檔案指標
	fseek(pf, -2, SEEK_END);
	//2,讀取檔案
	int eg = ftell(pf);
	printf("%d\n", eg);

	fclose(pf);
	pf = NULL;
	return 0;
}

執行結果:

由于是-2,從檔案結尾向左偏移2個,指向 r 前面的位置,所以結果是3(原HyDra)


rewind

  • 讓檔案指標的位置回到檔案的起始位置
//函式原型
void rewind ( FILE * stream );

例:

#include <stdio.h>
int main()
{
	FILE *pf = fopen("mysize.txt", "r");
	if (pf == NULL)
	{
		return 0;
	}

	int as = fgetc(pf);
	printf("%c\n", as);

	rewind(pf);
	as = fgetc(pf);
	printf("%c\n", as);

	fclose(pf);
	pf = NULL;
	return 0;
}

執行結果

由于恢復到了起始位置,所以列印出來仍為 H (原HyDra)

十、檔案讀取結束的判定

有一個函式特別容易被錯誤使用:feof

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

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

  • fgetc判斷是否為EOF
  • fgets判斷回傳值是否為NULL

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

  • fread判斷回傳值是否小于實際要讀的個數

例1(文本檔案):

這里我們參考的是之前創建的 eg.txt 檔案,我們將里面的內容全部清空,

代碼如下:

#include <stdio.h>
int main()
{
	//feof(); EOF - end of file - 檔案結束標志
	FILE *pf = fopen("eg.txt", "r");
	if (pf == NULL)
	{
		return 0;
	}
	int size = fgetc(pf);
	printf("%d\n", size);//-1
	fclose(pf);
	pf = NULL;
	return 0;
}

執行結果:

由此可見,檔案結束的位置確實存在一個 EOF


例2(二進制檔案):

#include <stdio.h>
int main()
{
	FILE *pf = fopen("mysize.txt", "r");
	if (pf == NULL)
	{
		perror("open file eg.txt");
		return 0;
	}
	//讀檔案
	int ag = 0;
	while ((ag = fgetc(pf)) != EOF)
	{
		putchar(ag);
	}
	if (ferror(pf))
	{
		printf("error\n");
	}
	else if (feof(pf))
	{
		printf(" end of file\n");
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

執行結果:

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

標籤:其他

上一篇:3分鐘教你搞定VMware 克隆虛擬主機之Centos系列虛擬機克隆[?建議收藏?]

下一篇:CentOS7詳細安裝教程--圖文介紹超詳細

標籤雲
其他(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)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more