主頁 > 軟體設計 > 檔案操作詳解(建議收藏)

檔案操作詳解(建議收藏)

2021-10-04 08:32:58 軟體設計

1.檔案的概念

檔案的基本概念
  所謂“檔案”是指一組相關資料的有序集合, 這個資料集有一個名稱,叫做檔案名,實際上在前面的各章中我們已經多次使用了檔案,例如源程式檔案、目標檔案、可執行檔案、庫檔案 (頭檔案)等,檔案通常是駐留在外部介質(如磁盤等)上的,在使用時才調入記憶體中來,從不同的角度可對檔案作不同的分類,從用戶的角度看,檔案可分為普通檔案和設備檔案兩種,

  普通檔案是指駐留在磁盤或其它外部介質上的一個有序資料集,可以是源檔案、目標檔案、可執行程式; 也可以是一組待輸入處理的原始資料,或者是一組輸出的結果,對于源檔案、目標檔案、 可執行程式可以稱作程式檔案,對輸入輸出資料可稱作資料檔案,

  設備檔案是指與主機相聯的各種外部設備,如顯示幕、列印機、鍵盤等,在作業系統中,把外部設備也看作是一個檔案來進行管理,把它們的輸入、輸出等同于對磁盤檔案的讀和寫, 通常把顯示幕定義為標準輸出檔案,一般情況下在螢屏上顯示有關資訊就是向標準輸出檔案輸出,如前面經常使用的printf,putchar 函式就是這類輸出,鍵盤通常被指定標準的輸入檔案, 從鍵盤上輸入就意味著從標準輸入檔案上輸入資料,scanf,getchar函式就屬于這類輸入,

  從檔案編碼的方式來看,檔案可分為ASCII碼檔案和二進制碼檔案兩種,

  ASCII檔案也稱為文本檔案,這種檔案在磁盤中存放時每個字符對應一個位元組,用于存放對應的ASCII碼,例如,數5678的存盤形式為:
ASC碼:  00110101 00110110 00110111 00111000
     ↓     ↓    ↓    ↓
十進制碼: 5     6    7    8 共占用4個位元組,ASCII碼檔案可在螢屏上按字符顯示, 例如源程式檔案就是ASCII檔案,用DOS命令TYPE可顯示檔案的內容, 由于是按字符顯示,因此能讀懂檔案內容,

  二進制檔案是按二進制的編碼方式來存放檔案的, 例如, 數5678的存盤形式為: 00010110 00101110只占二個位元組,二進制檔案雖然也可在螢屏上顯示,但其內容無法讀懂,C系統在處理這些檔案時,并不區分型別,都看成是字符流,按位元組進行處理,輸入輸出字符流的開始和結束只由程式控制而不受物理符號(如回車符)的控制, 因此也把這種檔案稱作“流式檔案”,

  本章討論流式檔案的打開、關閉、讀、寫、定位等各種操作,檔案指標在C語言中用一個指標變數指向一個檔案, 這個指標稱為檔案指標,通過檔案指標就可對它所指的檔案進行各種操作,定義說明檔案指標的一般形式為: FILE* 指標變數識別符號; 其中FILE應為大寫,它實際上是由系統定義的一個結構,該結構中含有檔案名、檔案狀態和檔案當前位置等資訊, 在撰寫源程式時不必關心FILE結構的細節,例如:FILE *fp;表示fp是指向FILE結構的指標變數,通過fp 即可找存放某個檔案資訊的結構變數,然后按結構變數提供的資訊找到該檔案,實施對檔案的操作,習慣上也籠統地把fp稱為指向一個檔案的指標,檔案的打開與關閉檔案在進行讀寫操作之前要先打開,使用完畢要關閉,所謂打開檔案,實際上是建立檔案的各種有關資訊,并使檔案指標指向該檔案,以便進行其它操作,關閉檔案則斷開指標與檔案之間的聯系,也就禁止再對該檔案進行操作,

2.檔案操作函式的介紹

1.fopen

函式原型:

函式說明:

filenmae為檔案名,mode是打開方式,如果以“r"的方式打開,并且此檔案不存在則會出錯,下面我們來看一個例子:

#include<stdio.h>
int main()
{
	FILE*fp=fopen("text.txt", "r");
	if (fp == NULL)
	{
		perror("fopen:");
		return -1;
	}
	fclose(fp);
	return 0;
}

此時我們用fopen這個函式來打開text.txt這個檔案,并且是以"r"的形式來打開的,而我并沒有創建這個檔案,所以此次打開是失敗的,我們可以用perror來列印錯誤資訊

運行結果:

如果我們以讀的方式打開,如果打開的檔案不存在它會自動生成,如果打開的檔案存在,則會將檔案里面的內容清空

下面我們來看例子:

#include<stdio.h>
int main()
{
	FILE*fp=fopen("text.txt", "w");
	if (fp == NULL)
	{
		perror("fopen:");
		return -1;
	}
	fclose(fp);
	return 0;
}

我們可以發現當運行程式的時候,他會自動生成對應的檔案

如果我此時點進去,并輸入資料進去,并將其保存

當運行完這個程式之后:

我們可以發現里面的資料被清空了

總結:打開檔案的作用:

1)分配給打開檔案一個FILE 型別的檔案結構體變數,并將有關資訊填入檔案結構體變數;
(2)開辟一個緩沖區;
(3)呼叫作業系統提供的打開檔案或建立新檔案功能,打開或建立指定檔案;
FILE *:指出fopen是一個回傳檔案型別的指標函式;

回傳值
   正常回傳:被打開檔案的檔案指標,
   例外回傳:NULL,表示打開操作不成功,

要說明的是:C語言將計算機的輸入輸出設備都看作是檔案,例如,鍵盤檔案、螢屏檔案等,ANSI C標準規定,在執行程式時系統先自動打開鍵盤、螢屏、錯誤三個檔案,這三個檔案的檔案指標分別是:標準輸入stdin、標準輸出stdout和標準出錯 stderr,

fclose():檔案關閉

3.fclose:

1.函式原型:

函式說明:stream

回傳值:0表示正常回傳

例外回傳:EOF,表示檔案關閉失敗;或者關閉時發生錯誤

fgetc()讀取一個字符

1.函式原型:

函式說明:

從fp中讀取一個字符,并作為回傳值回傳

回傳值:

1.正常回傳:

回傳讀取字符的ASSCLL值

2.例外回傳:

讀取失敗,則會回傳EOF.例如:如果我們以寫的形式打開,但是我們使用fgetc()去讀取一個字符時,則會發生錯誤而回傳EOF

例:

#include<stdio.h>
int main()
{
	FILE*fp=fopen("text.txt", "r");
	if (fp == NULL)
	{
		perror("fopen:");
		return -1;
	}
	int ch = fgetc(fp);
	
	printf("%d", ch);
	fclose(fp);
	fp = NULL;
	return 0;
}

運行結果:

注意:之所以會列印-1,這是因為EOF是一個宏,值就是-1;

正常用法:

在這里我先往text.txt中輸入資料

然后在讀取:

#include<stdio.h>
int main()
{
	FILE*fp=fopen("text.txt", "r");
	if (fp == NULL)
	{
		perror("fopen:");
		return -1;
	}
	int ch=fgetc(fp);
	printf("%c", ch);
	fclose(fp);
	fp = NULL;
	return 0;
}

運行結果:

重點!!!!fgets()從所有輸入流中讀取字串

1.函式原型:

函式說明:

函式說明:由fp指出的檔案中讀取n-1個字符,并把他們存放到有str指出的字符陣列中區,最后加上一個由字串結束符'\0'

引數說明:str:接受字串的記憶體地址,可以是陣列別名,也可以是指標

n:指出要讀取的字符的個數

fp:這個是檔案指標,指出要從中讀取字符的檔案

回傳值:

正常回傳:字串的記憶體首地址,即str的值

例外回傳:回傳一個NULL值,此時應當用feof()或ferror()函式來判別是讀取到了檔案尾,

2.標準庫中的實作:

/****************************************************
char *fgets(char *s, int n, FILE *stream)
{
register int c;
register char *cs;
cs=s;
while(--n>0 &&(c = getc(stream))!=EOF)
if ((*cs++= c) =='\n')
break;
*cs ='\0';
return (c == EOF && cs == s) ?NULL :s ;
}
/********************************************************

使用注意:

在用fgets(..)讀入資料時,先定義一個字符陣列或字符指標,如果定義了字符指標 ,那么一定要初始化,

char*s;//不可以
char arr[20];//可以

所以如果要使用指標我們可以使用動態記憶體開辟的方式為其分配空間

char *s=(char*)malloc(sizeof(char)*20);

3. fgets()讀取文本行時有兩種情況:

1.當要讀取的個數大于一行字串的長度,那么當讀到末尾\n時,fegets將\n取走之后就停止讀取了,并且在字串s的末尾加上\0

首先在對應檔案中輸入資料,在運行下列程式

代碼:

#include<stdio.h>
int main()
{
	FILE*fp=fopen("text.txt", "r");
	if (fp == NULL)
	{
		perror("fopen:");
		return -1;
	}
	char tmp[20];
	fgets(tmp, 12, fp);
	printf(tmp);
	fclose(fp);
	fp = NULL;
	return 0;
}

我們可以通過除錯來看是不是這樣的:

我們可以發現末尾的\n被讀走

2.當要讀取的個數小于一行的個數時,此時只會讀取n-1個字符

同樣是上面的代碼我們只改變讀取個數:

#include<stdio.h>
int main()
{
	FILE*fp=fopen("text.txt", "r");
	if (fp == NULL)
	{
		perror("fopen:");
		return -1;
	}
	char tmp[20];
	fgets(tmp, 4, fp);
	printf(tmp);
	fclose(fp);
	fp = NULL;
	return 0;
}

同樣的我們通過除錯的方法進行驗證:

我們可以發現,我們是想要讀取4個字符但是他只讀取了3個字符,也就是說當我們想要讀取n個字符時,它實際上只會讀取n-1個字符

4.fgets和gets

在一定的情況下可以使用fgets代替gets

fgets(...)從標準設備讀資料,

用fgets(...)還也讀入標準輸入設備(一般為鍵盤)的資訊

原型 : fgets(s,n,stdin);

假設在控制臺下,我們可以用fgets(...)替代gets(),讀入鍵盤輸入的資訊,fgets()是安全的,因為不會像gets()有溢位的可能,,

比如 :輸入 abc

fgets(s,n,stdin)也會讀入n-1個字符,但是只是從stdin流讀入



fgets函式fgets函式用來從檔案中讀入字串,fgets函式的呼叫形式如下:fgets(str,n,fp);此處,fp是檔案指標;str是存放在字串的起始地址;n是一個int型別變數,函式的功能是從fp所指檔案中讀入n-1個字符放入str為起始地址的空間內;如果在未讀滿n-1個字符之時,已讀到一個換行符或一個EOF(檔案結束標志),則結束本次讀操作,讀入的字串中最后包含讀到的換行符,因此,確切地說,呼叫fgets函式時,最多只能讀入n-1個字符,讀入結束后,系統將自動在最后加'\0',并以str作為函式值回傳,

gets()將洗掉新行符, fgets()則保留新行符.

要去掉fgets()最后帶的“\0",只要用 s[strlen(s)-1]='\0';即可,

fgets不會像gets那樣自動地去掉結尾的\n,所以程式中手動將\n位置處的值變為\0,代表輸入的結束,

針對于fgets,還要再說兩句,下面這種用法,是安全的判斷檔案讀取結束或者出錯的好方式,切忌不能使用while(!feof(fp)) ,還有對于fgets的第二個引數是最大能讀取檔案字符的個數,一般最大的長度是1024位元組,

while(fgets(..., stream)){

/* ... */
}

if(ferror(stream)){

/* ... */

}

fputs

1.函式原型:

函式說明;是將字串string,輸出到輸出到檔案或者螢屏上

回傳值:

正常回傳:

寫入到檔案中的個數

例外回傳:

回傳一個NULL,此時應該用feof()或者ferror函式來判斷,是否讀到檔案的末尾,還是發生了錯誤

#include<stdio.h>
int main()
{
	FILE*fp=fopen("text.txt", "w");
	if (fp == NULL)
	{
		perror("fopen:");
		return -1;
	}
	fputs("hello world", fp);
	fclose(fp);
	fp = NULL;
	return 0;
}

運行之后:

我么可以發現對應的檔案中:

fprintf

1.函式原型

2,函式說明:

2.功能說明
  將變數表列(arg_list)中的資料,按照format指出的格式,寫入由fp指定的檔案,fprintf()函式與printf()函式的功能相同,只是printf()函式是將資料寫入螢屏檔案(stdout),
3.引數說明
  fp:這是個檔案指標,指出要將資料寫入的檔案,
  format:這是個指向字串的字符指標,字串中含有要寫出資料的格式,所以該字串成為格式串,格式串描述的規則與printf()函式中的格式串相同,
arg_list:是要寫入檔案的變數表列,各變數之間用逗號分隔,

例子:

#include<stdio.h>
int main()
{
	FILE*fp=fopen("text.txt", "w");
	if (fp == NULL)
	{
		perror("fopen:");
		return -1;
	}
	int a = 10;
	char tmp[] = "abceded";
	fprintf(fp, "%d%s", a, tmp);
	fclose(fp);
	fp = NULL;
	return 0;
}

運行結果:

同樣他也能夠像printf一樣輸出到螢屏上

#include<stdio.h>
int main()
{
	FILE*fp=fopen("text.txt", "w");
	if (fp == NULL)
	{
		perror("fopen:");
		return -1;
	}
	int a = 10;
	char tmp[] = "abceded";
	fprintf(stdout, "%d %s", a, tmp);
	fclose(fp);
	fp = NULL;
	return 0;
}

運行結果:

fread fwrite

1.函式原型:

2.函式說明:

2. 功能說明
  從由fp指定的檔案中,按二進制形式將sife*count個資料讀到由buffer指出的資料區中,
3. 引數說明
buffer:這是一個void型指標,指出要將讀入資料存放在其中的存盤區首地址,
sife:指出一個資料塊的位元組數,即一個資料塊的大小尺寸,
count:指出一次讀入多少個資料塊(sife),
fp:這是個檔案指標,指出要從其中讀出資料的檔案,
4.回傳值
  正常回傳:實際讀取資料塊的個數,即count,
  例外回傳:如果檔案中剩下的資料塊個數少于引數中count指出的個數,或者發生了錯誤,回傳0值,此時可以用feof()和ferror()來判定到底出現了什么
情況,

H. 以二進制形式寫資料到檔案中去

1. 函式原型

int fwrite(void *buffer,unsigned sife,unsigned count,FILE *fp)

2. 功能說明
  按二進制形式,將由buffer指定的資料緩沖區內的sife*count個資料寫入由fp指定的檔案中去,
3. 引數說明
buffer:這是一個void型指標,指出要將其中資料輸出到檔案的緩沖區首地址,
sife:指出一個資料塊的位元組數,即一個資料塊的大小尺寸,
count:一次輸出多少個資料塊(sife),
fp:這是個檔案指標,指出要從其中讀出資料的檔案,
4.回傳值
  正常回傳:實際輸出資料塊的個數,即count,
  例外回傳:回傳0值,表示輸出結束或發生了錯誤,

例子:

#include<stdio.h>
int main()
{
	FILE*fp=fopen("text1.txt", "wb");
	if (fp == NULL)
	{
		perror("fopen:");
		return -1;
	}

	int a = 10;
	char tmp[] = "1abceded";
	fwrite(tmp, sizeof(tmp), 1, fp);
	fclose(fp);
	fp = NULL;
	return 0;
}

程式運行起來之后打開對應的檔案我們可以發現

我們看不懂此時我們可以使用fread來讀取

#include<stdio.h>
int main()
{
	FILE*fp=fopen("text1.txt", "rb");
	if (fp == NULL)
	{
		perror("fopen:");
		return -1;
	}
char arr[10]={0};
fread(arr,sizeof(char)*9,1,fp);
printf(arr);
	
	fclose(fp);
	fp = NULL;
	return 0;
}

運行結果:

fseek()

1.函式原型:

2.函式說明:

2) 功能說明
   使檔案指標fp移到基于base的相對位置offset處,
(3)引數說明
   fp:檔案指標,
   offset:相對base的位元組位移量,這是個長整數,用以支持大于64KB的檔案,
   base:檔案位置指標移動的基準位置,是計算檔案位置指標位移的基點,ANSI C定義了base的可能取值,以及這些取值的符號常量,

(4)回傳值

  正常回傳:當前指標位置,
  例外回傳:-1,表示定位操作出錯,

例子:

#include <stdio.h>
#include <string.h>
struct std_type
{
    int num;
    char name[20];
    int age;
    char class;
}stud;
int cstufile()
{
    int i;
    FILE *fp;
    if((fp=fopen("stufile","wb"))==NULL)
    {
        printf("The file can't be opened for write.\n");
        return 0;
    }
    for(i=1;i<=100;i++)
    {
        stud.num=i;
        strcpy(stud.name,"aaaa");
        stud.age=17;
        stud.class='8';
        fwrite(&stud,sizeof(struct std_type),1,fp);
    }
    fclose(fp);
    return 1;
}
void main()
{
    int n;
    FILE *fp;
    if(cstufile()==0) return;
    if((fp=fopen("stufile","rb"))==NULL)
    {
        printf("The file can not be opened.\n");
        return;
    }
    for(n=0;n<100;n+=2)
    {
        fseek(fp,n*sizeof(struct std_type),SEEK_SET);
        fread(&stud,sizeof(struct std_type),1,fp);
        printf("%10d%20s%10d%4c\n",stud.num,stud.name,stud.age,stud.class);
    }
    fclose(fp);
}

補充:

關于exit()函式
1. 函式原型

void exit(int status)
2. 功能說明
  exit()函式使程式立即終止執行,同時將緩沖區中剩余的資料輸出并關閉所有已經打開的檔案,
3. 引數說明
  status:為0值表示程式正常終止,為非0值表示一個定義錯誤,
4. 回傳值
  無,

關于feof()函式
1. 函式原型

int feof(FILE *fp)
2. 功能說明
   在文本檔案(ASCII檔案)中可以用值為-1的符號常量EOF來作為檔案的結束符,但是在二進制檔案中-1往往可能是一個有意義的資料,因此不能用它 來作為檔案的結束標志,為了能有效判別檔案是否結束,ANSI C提供了標準函式feof(),用來識別檔案是否結束,
3. 引數說明
  fp:檔案指標,
4. 回傳值
  回傳為非0值:已到檔案尾,
  回傳為0值:表示還未到檔案尾,

fscanf

1.函式原型:fscanf(FILE *fp, const char *format, agars)

2,函式說明:

1.fscanf():
fscanf()函式的頭檔案是<stdio.h>,

函式原型 為 int fscanf(FILE*stream, constchar*format, [argument...]);

其功能為根據資料格式(format)從輸入流(stream)中寫入資料(argument);

【引數】stream為檔案指標,format為格式化字串,argument 為格式化控制符對應的引數,



從檔案指標fp指向的檔案中,按format中對應的控制格式讀取資料,并存盤在agars對應的變數中;

#include<stdio.h>
int main()
{
	FILE*fp=fopen("text.txt", "r");
	if (fp == NULL)
	{
		perror("fopen:");
		return -1;
	}
	int a;
	double b;
	fscanf(fp, "%d %lf", &a, &b);
	printf("%d %lf", a, b);
	fclose(fp);
	fp = NULL;
	return 0;
}

檔案:

運行結果:

ssprintf()函式和sscanf()函式的用法

1、ssprinf( )函式的用法

sprintf的作用是將一個格式化的字串輸出到一個目的字串中,而printf是將一個格式化的字串輸出到螢屏,其原型為:
int sprintf(char *str, char * format [, argument, ...]);
sprintf()會根據引數format 字串來轉換并格式化資料,然后將結果復制到引數str 所指的字串陣列,直到出現字串結束('\0')為止,
【回傳值】成功則回傳引數str 字串長度,失敗則回傳-1,
sprintf()最常見的應用之一莫過于把整數列印到字串中,如:
sprintf(s, "%d", 123); //把整數123列印成一個字串保存在s中
sprintf(s, "%8x", 4567); //小寫16進制,寬度占8個位置,右對齊



2、sscanf( )函式的用法

sscanf與scanf類似,都是用于輸入的,只是后者以螢屏(stdin)為輸入源,前者以固定字串為輸入源,
sscanf與scanf類似,都是用于輸入的,只是后者以螢屏(stdin)為輸入源,前者以固定字串為輸入源,
函式原型:
int sscanf( string str, char *format, mixed var1, mixed var2 ... );
eg: sscanf(surBuf, "%[1-9]", dstBuf);
先說下%[]:其基本格式為 %[set],表示將接收一個由set指定格式的字串,其中set表示可接受的字符集合,
set一般有兩種情況:
一種是"^set"表示非, 即在輸入的字串中將匹配所有不在set中出現的字符,遇到set中的字符時停止匹配,
另一種是"set"表示在輸入的字串中將匹配所有在set中出現的字符,遇到非set中的字符時停止匹配,

對比一組函式

函式名稱函式功能
fscanf從所有輸入流中讀取格式化資料
scanf從標準輸入流中讀取格式化資料
sscnaf從字串中讀取格式化資料
函式名稱函式功能
printf把格式化資料輸出到螢屏上去
fprintf把格式化資料輸出到所有輸出流中
sprintf把格式化資料轉成字串

請大佬多多指教!

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

標籤:其他

上一篇:圖論最短路及生成樹(Prim,Djikstra,Spfa,Bellan-ford,kruskal,topsort)

下一篇:為什么有人說CPU是人造物的巔峰?

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