首先是最簡單的讀寫一個字符的函數(shù)fputc和fgetc,在這個基礎(chǔ)上又出現(xiàn)了putw和getw、fgets和fputs,此外還說過格式化讀寫函數(shù)fprintf和fscanf函數(shù)。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供常寧網(wǎng)站建設(shè)、常寧做網(wǎng)站、常寧網(wǎng)站設(shè)計、常寧網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、常寧企業(yè)網(wǎng)站模板建站服務(wù),10多年常寧做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
從原理上來說,只要fputc和fgetc函數(shù)基本就可以完成數(shù)據(jù)的讀寫操作了,但是在實際的使用中會遇到諸多不便,因此上面那一大堆函數(shù)就冒出來了(其實也不多)。上面函數(shù)中最方便的就是格式化讀寫函數(shù)fprintf和fscanf了,因為可以一行行的進(jìn)行讀取,但是有個問題就是這兩位老人家動作比較慢,fprintf在寫文件的時候要把二進(jìn)制形式表示的數(shù)據(jù)轉(zhuǎn)換為ASCII碼形式,fscanf在讀文件的時候又要將ASCII碼轉(zhuǎn)換為二進(jìn)制的形式。
好不容易出來個好用的函數(shù),竟然是個慢性子,聰明的你現(xiàn)在也許就在想了:那能不能不轉(zhuǎn)換,直接讀寫二進(jìn)制的數(shù)據(jù)呢?答案就是fread和fwrite,在需要頻繁進(jìn)行數(shù)據(jù)讀寫的時候,使用這兩個函數(shù)將大大提升效率。
fread和fwrite函數(shù)的定義
fread(pBuffer,size,count,pFile);
fwrite(pBuffer,size,count,pFile);
要讀寫一個數(shù)據(jù)塊的話,無論是讀還是寫,都需要指定一個起始地址,讀的話從這個起始地址讀,寫的話從這個起始地址寫,上面函數(shù)定義中的第一個參數(shù)pBuffer就是用于指定這個起始地址,size讀寫的字節(jié)數(shù),count則指定讀寫多少個size大小的數(shù)據(jù),pFile是文件結(jié)構(gòu)指針。
fread和fwrite函數(shù)使用示例
說到數(shù)據(jù)塊我們自然會想到結(jié)構(gòu)體,如果一個文件中保存的是一個個結(jié)構(gòu)體信息,那每一個結(jié)構(gòu)體信息就可以看做一個數(shù)據(jù)塊了。這里直接用前面文章中我們一直使用的學(xué)生成績信息的結(jié)構(gòu)體:
C語言: 知蟻博客
struct student
{
int nID; //學(xué)號
char chName[20]; //姓名
float fScores[3]; //3門課的成績
};
實例程序有點小復(fù)雜的,首先我們自己新建一個txt文件,也就是ASCII文件啦,然后寫上一些數(shù)據(jù),如下:
1 zhangsan 78.0 79.0 80.0
2 lisi 79.0 77.0 78.0
3 wangwu 90.0 97.0 78.0
4 zhaokai 56.0 57.0 58.0
我們先用ASCII方式打開這個文件,通過fscanf函數(shù)讀取里面的數(shù)據(jù),然后通過fwrite寫入到新的二進(jìn)制格式的文件中,這樣我們就得到了一個保存上面信息的二進(jìn)制格式的文件了,下面就是通過fread函數(shù)進(jìn)行數(shù)據(jù)的讀取了。(記住:fread和fwrite一般用于二進(jìn)制文件的輸入輸出,ASCII文件還是不要考慮了)。
C++語言: 知蟻博客
#include "stdio.h"
struct student
{
int nID; //學(xué)號
char chName[20]; //姓名
float fScores[3]; //3門課的成績
};
void main()
{
FILE *pRead,*pWrite;
struct student tStu[4];
struct student *ptStu = NULL;
int nCount = 0;
//ASCII方式打開文件 用于讀入
pRead=fopen("stu_scores.txt","r");
if(NULL == pRead)
{
return;
}
//二進(jìn)制文件打開文件 用于寫入
pWrite=fopen("stu_scores_bin.txt","wb");
if(NULL == pWrite)
{
fclose(pRead);
return;
}
//fscanf讀取數(shù)據(jù),fwrite寫入數(shù)據(jù)
ptStu = tStu;
while(!feof(pRead))
{
fscanf(pRead,"%d %s %f %f %f\n",ptStu-nID,ptStu-chName,ptStu-fScores[0],ptStu-fScores[1],ptStu-fScores[2]);
fwrite(ptStu,sizeof(struct student),1,pWrite);
printf("%d %s %.1f %.1f %.1f\n",ptStu-nID,ptStu-chName,ptStu-fScores[0],ptStu-fScores[1],ptStu-fScores[2]);
ptStu++;
}
fclose(pRead);
fclose(pWrite);
memset(tStu,0×00,sizeof(tStu)); //清空數(shù)據(jù)
//二進(jìn)制文件打開文件 用于讀取
pRead=fopen("stu_scores_bin.txt","rb");
if(NULL == pRead)
{
printf("open file stu_scores_bin.txt failed");
return;
}
//下面有兩種fread的讀數(shù)據(jù)方式,將下面的1換成0,則使用第二種方式
#if 1
//一條條的讀取
ptStu = tStu;
nCount = fread(ptStu,sizeof(struct student),1,pRead);
while(nCount0)
{
printf("%d %s %.1f %.1f %.1f\n",ptStu-nID,ptStu-chName,ptStu-fScores[0],ptStu-fScores[1],ptStu-fScores[2]);
ptStu++;
nCount = fread(ptStu,sizeof(struct student),1,pRead);
}
#else
//因為事先知道有4條信息,因此可以直接讀取四條信息
fread(tStu,sizeof(struct student),4,pRead);
for(nCount=0; nCount4; nCount++)
{
printf("%d %s %.1f %.1f %.1f\n",tStu[nCount].nID,tStu[nCount].chName,tStu[nCount].fScores[0],tStu[nCount].fScores[1],tStu[nCount].fScores[2]);
}
#endif
fclose(pRead);
}
上面用fread讀取的時候,我們既可以一條條的讀取,也可以一次讀入多條,這就是為什么參數(shù)中有size和count的原因
feof(),用這個函數(shù)判斷是否讀到文件尾了。
fread(buf,size,count,fp);//buf輸入數(shù)據(jù)起始地址,size 每個數(shù)據(jù)塊的大小,count 每次寫入的數(shù)據(jù)塊個數(shù),fp 文件指針
寫好后是:
while(!feof(fp))
{
fread(temp[i],sizeof(struct use),1,fp);//這個讀出來放數(shù)組里面
i++;
}
問題是你讀的是txt文件,完全可以用fscanf()函數(shù)么。
#include sys/wait.h
#include assert.h
#include stdio.h
#include stdlib.h
#include unistd.h
#include string.h
int main(int argc, char *argv[])
{
int pfd[2];
pid_t cpid;
char buf;
assert(argc == 2);
if (pipe(pfd) == -1)
{
perror("pipe");
exit(EXIT_FAILURE);
}
//創(chuàng)建子進(jìn)程
cpid = fork();
if (cpid == -1)
{
//創(chuàng)建子進(jìn)程失敗
perror("fork"); exit(EXIT_FAILURE);
}
if (cpid == 0)
{ /* 子進(jìn)程中讀取管道里面讀數(shù)據(jù) */
close(pfd[1]); /* 關(guān)閉不使用的管道寫入端 */
while (read(pfd[0], buf, 1) 0)
{
write(STDOUT_FILENO, buf, 1);//在標(biāo)準(zhǔn)的輸出設(shè)備上輸出讀取管到的內(nèi)容
}
write(STDOUT_FILENO, "\n", 1);
close(pfd[0]);
_exit(EXIT_SUCCESS);
}
else
{ /* 父進(jìn)程將參數(shù) argv[1]字符串 寫入管道 */
close(pfd[0]); /* 關(guān)閉不使用的管道讀取端 */
write(pfd[1], argv[1], strlen(argv[1]));
close(pfd[1]); /* 關(guān)閉管道寫入端,此時讀取端就會收到 EOF 標(biāo)志*/
wait(NULL); /* 等待子進(jìn)程運行結(jié)束 */
exit(EXIT_SUCCESS);
}
}
文章名稱:c語言pread函數(shù),c語言precede函數(shù)
網(wǎng)站網(wǎng)址:http://chinadenli.net/article16/dsegodg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、App設(shè)計、商城網(wǎng)站、網(wǎng)站收錄、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)