c語言文件結構體
❶ c語言文件操作——結構體的讀寫問題
fread(&a[i],sizeof(BOOK),1,fp);
//這句就把數據讀出來了,下面列印就行了printf("%ld
%s
%s
%s
%s
%ld
%.2f\n",a[i].num,a[i].name,a[i].writer,a[i].sort,a[i].publisher,a[i].time,a[i].price);
❷ C語言對結構體文件的讀取
C語言中對結構體數據格式文件進行讀取時,必須以二進制格式打開文件,然後按結構體類型變數內存塊方式進行數據讀取,相關讀數據命令為fread()。
函數說明:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
從stream文件流中,讀取nmemb個size大小的數據塊到ptr所指的內存buf中,返回讀取到的有效數據塊數。
如,有如下結構體定義:
typedef struct TEST
{
int num;
double score;
}STRTEST;
STRTEST data ;
FILE *fp = fopen("file.dat", "rb" ) ; //按二進制格式打開文件
int n=fread( &data, sizeof(STRTEST), 1, fp ); //讀取一個數據塊到變數data中。
注意,當結構體中定義的變數有指針類型時,在存儲數據時,就不能按結構體進行存儲了。
因為,指針變數中存儲的是內存地址,而程序在不同環境運行時,所使用的內存地址是不同的,只存儲內存地址,不能把真正的數據保存下來,所以,即使是正確讀取到文件內容,也不能得到當時的結構體內存數據。因而,在存儲結構體數據時,要根據結構體類型變數特點採用正確的方法進行存儲,才能正確的讀取。
❸ C語言結構體定義
C語言結構體定義:struct為結構體關鍵字,tag為結構體的標志,member-list為結構體成員列表,其必須列出其所有成員;variable-list為此結構體聲明的變數。
結構體是C語言中聚合數據類型(aggregatedatatype)的一類。結構體可以被聲明為變數、指針或數組等,用以實現較復雜的數據結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問。
(3)c語言文件結構體擴展閱讀
1、struct是聲明結構體類型時必須使用的關鍵字,不能省略。「結構體」這個詞是根據英文單詞structure譯出的。
2、structSTUDENT是定義的數據類型的名字,它向編譯系統聲明這是一個「結構體類型」,包括name、num、sex、age、score、addr等不同類型的項。
3、structSTUDENT與系統提供的int、char、float、double等標准類型名一樣,都是數據類型,具有同樣的作用,都是用來定義變數的。
❹ C語言FILE結構體如何解釋
FILE結構體
C語言的stdio.h頭文件中,定義了用於文件操作的結構體FILE。這樣,我們通過fopen返回一個文件指針(指向FILE結構體的指針)來進行文件操作。可以在stdio.h(位於visual studio安裝目錄下的include文件夾下)頭文件中查看FILE結構體的定義,如下:
TC2.0中:
typedef struct {
short level; /* fill/empty level of buffer */
unsigned flags; /* File status flags */
char fd; /* File descriptor */
unsigned char hold; /* Ungetc char if no buffer */
short bsize; /* Buffer size */
unsigned char *buffer; /* Data transfer buffer */
unsigned char *curp; /* Current active pointer */
unsigned istemp; /* Temporary file indicator */
short token; /* Used for validity checking */
} FILE; /* This is the FILE object */
VC6.0中:
#ifndef _FILE_DEFINED
struct _iobuf {
char *_ptr; //文件輸入的下一個位置
int _cnt; //當前緩沖區的相對位置
char *_base; //指基礎位置(即是文件的其始位置)
int _flag; //文件標志
int _file; //文件的有效性驗證
int _charbuf; //檢查緩沖區狀況,如果無緩沖區則不讀取
int _bufsiz; //???這個什麼意思
char *_tmpfname; //臨時文件名
};
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif
用VC 控制台程序實現Word 的排版功能,輸入文件名讀取小於64k 的英文文本,
然後對英文文本進行勻齊排版,最後結果為:一行70個字元,左右兩邊分別空
4 個字元,長單詞不能折斷,每行必須對齊,單詞中間插入空格。均勻插入。
注意:1、不能用STL庫,類似文件流fstream都不允許用
2、不能用sdk,mfc,windows api
3、用最基本的c/c++實現
從文件輸入輸出:
#include<stdio.h>
FILE *in,*out;
in=fopen("a.txt","r"); //其意義是在當前目錄下打開文件a.txt, 只允許進行「讀」操作,並使in指向該文件。
out=fopen("aout.txt","w"); //打開aout.txt, 只能向該文件寫入數據, 如果不存在則創建aout.txt;
fscanf(in,"%d",&a);
fprintf(out,"%d",a);
fscanf(stdin,"%d",&a)=scanf("%d",&a);
fclose(in);
fclose(out);
文件使用方式 意 義
「rt」只讀打開一個文本文件,只允許讀數據
「wt」只寫打開或建立一個文本文件,只允許寫數據
「at」追加打開一個文本文件,並在文件末尾寫數據
「rb」只讀打開一個二進制文件,只允許讀數據
「wb」 只寫打開或建立一個二進制文件,只允許寫數據
「ab」 追加打開一個二進制文件,並在文件末尾寫數據
「rt+」 讀寫打開一個文本文件,允許讀和寫
「wt+」 讀寫打開或建立一個文本文件,允許讀寫
「at+」 讀寫打開一個文本文件,允許讀,或在文件末追加數據
「rb+」 讀寫打開一個二進制文件,允許讀和寫
「wb+」 讀寫打開或建立一個二進制文件,允許讀和寫
「ab+」 讀寫打開一個二進制文件,允許讀,或在文件末追加數據
對於文件使用方式有以下幾點說明:
1. 文件使用方式由r,w,a,t,b,+六個字元拼成,各字元的含義是:
r(read): 讀
w(write): 寫
a(append): 追加
t(text): 文本文件,可省略不寫
b(banary): 二進制文件
+: 讀和寫
2. 凡用「r」打開一個文件時,該文件必須已經存在, 且只能從該文件讀出。
3. 用「w」打開的文件只能向該文件寫入。 若打開的文件不存在,則以指定的文件名建立該文件,若打開的文件已經存在,則將該文件刪去,重建一個新文件。
4. 若要向一個已存在的文件追加新的信息,只能用「a 」方式打開文件。但此時該文件必須是存在的,否則將會出錯。
5. 在打開一個文件時,如果出錯,fopen將返回一個空指針值NULL。在程序中可以用這一信息來判別是否完成打開文件的工作,並作相應的處理。因此常用以下程序段打開文件:
if((fp=fopen("c:\\hzk16","rb")==NULL)
{
printf("\nerror on open c:\\hzk16 file!");
getch(); //等待用戶敲入一個字元再運行
exit(1);
}
* 字元讀寫函數 :fgetc和fputc
* 字元串讀寫函數:fgets和fputs
* 數據塊讀寫函數:freed和fwrite
* 格式化讀寫函數:fscanf和fprinf
❺ C語言結構體Struct怎麼使用
在Turbo C中,結構也是一種數據類型, 可以使用結構變數,因此,像其它類型的變數一樣,在使用結構變數時要先對其定義。
如果需要定義多個具有相同形式的結構變數時用這種方法比較方便,它先作結構說明,再用結構名來定義變數。
(5)c語言文件結構體擴展閱讀
指向結構體的指針是一個一直都沒有掌握好的點,希望這里能記錄好一點,加強理解。
對於指針有幾個好處,
第一:就像指向數組的指針比數組本身更容易操作一樣,指向結構的指針通常也更容易操作;
第二:在早期的C中參數傳遞只能使用結構的指針;
第三:很多奇妙的數據表示都是用了包含指向其他結構的指針的結構。
和數組不同,結構的名字不是該結構的地址(即單獨的結構名並不是該結構地址的同義詞),必須使用 & 運算符。
參考資料c語言結構體struct相關使用說明
❻ c語言 結構體與文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#defineprint_error(str)fprintf(stdout,"ERROR:%s ",str)
#defineNUM5
typedefstructScore
{
floata;
floatb;
floatc;
}Score;
typedefstructStudent
{
charno[11];
charname[8];
Scorecj;
floatavg;
}Student;
voidinit_student(Student*st,intlen)
{
if(0==st||0>=len)
{
print_error("studentisNULLorLENGTHiszero");
exit(-1);
}
printf("inputnonamecj[a,b,c] ");
for(inti=0;i<len;++i)
{
printf("%d-->",i+1);
scanf("%s%s%f%f%f",st[i].no,st[i].name,&st[i].cj.a,&st[i].cj.b,
&st[i].cj.c);
}
}
voiddisplay(Student*st,intlen)
{
if(0==st||0>=len)
{
print_error("studentisNULLorLENGTHiszero");
exit(-1);
}
for(inti=0;i<len;++i)
{
printf("%s%s%.1f%.1f%.1f%.1f ",st[i].no,st[i].name,st[i].cj.a,
st[i].cj.b,st[i].cj.c,st[i].avg);
}
}
voidcalc_avg(Student*st,intlen)
{
if(0==st||0>=len)
{
print_error("studentisNULLorLENGTHiszero");
exit(-1);
}
for(inti=0;i<len;++i)
{
st[i].avg=(st[i].cj.a+st[i].cj.b+st[i].cj.c)/3.0;
}
}
voidsave(Student*st,intlen,constchar*file_name)
{
if(0==st||0>=len||0==file_name)
{
print_error("");
exit(-1);
}
FILE*fp=fopen(file_name,"w+");
if(fp)
{
charbuf[255]={0};
for(inti=0;i<len;++i)
{
sprintf(buf,"%s%s%.1f%.1f%.1f%.1f ",st[i].no,st[i].name,
st[i].cj.a,st[i].cj.b,st[i].cj.c,st[i].avg);
fwrite(buf,strlen(buf),1,fp);
memset(buf,0x00,sizeof(buf));
}
fclose(fp);
}
}
intmain(intargc,char*argv[])
{
Studentst[NUM];
init_student(st,NUM);
printf("------------------- ");
calc_avg(st,NUM);
printf("------------------- ");
display(st,NUM);
save(st,NUM,"d:\stud");//文件名,按實際修改
return0;
}
❼ 關於C語言的文件寫入結構體數據
結構體寫入文件是有前提的,你的結構體中不能出現指針,如果確定結構體中沒有指針的話,就可以進行如下操作
typedef struct
{
//中間不能定義指針;
}a;
a var //結構體定義的變數
fwrite(&var, sizeof(a), sizeof(a), hfile);