资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

c语言pread函数,c语言precede函数

读写数据块函数fread怎么用?

首先是最简单的读写一个字符的函数fputc和fgetc,在这个基础上又出现了putw和getw、fgets和fputs,此外还说过格式化读写函数fprintf和fscanf函数。

创新互联专业为企业提供常宁网站建设、常宁做网站、常宁网站设计、常宁网站制作等企业网站建设、网页设计与制作、常宁企业网站模板建站服务,10多年常宁做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

从原理上来说,只要fputc和fgetc函数基本就可以完成数据的读写操作了,但是在实际的使用中会遇到诸多不便,因此上面那一大堆函数就冒出来了(其实也不多)。上面函数中最方便的就是格式化读写函数fprintf和fscanf了,因为可以一行行的进行读取,但是有个问题就是这两位老人家动作比较慢,fprintf在写文件的时候要把二进制形式表示的数据转换为ASCII码形式,fscanf在读文件的时候又要将ASCII码转换为二进制的形式。

好不容易出来个好用的函数,竟然是个慢性子,聪明的你现在也许就在想了:那能不能不转换,直接读写二进制的数据呢?答案就是fread和fwrite,在需要频繁进行数据读写的时候,使用这两个函数将大大提升效率。

fread和fwrite函数的定义

fread(pBuffer,size,count,pFile);

fwrite(pBuffer,size,count,pFile);

要读写一个数据块的话,无论是读还是写,都需要指定一个起始地址,读的话从这个起始地址读,写的话从这个起始地址写,上面函数定义中的第一个参数pBuffer就是用于指定这个起始地址,size读写的字节数,count则指定读写多少个size大小的数据,pFile是文件结构指针。

fread和fwrite函数使用示例

说到数据块我们自然会想到结构体,如果一个文件中保存的是一个个结构体信息,那每一个结构体信息就可以看做一个数据块了。这里直接用前面文章中我们一直使用的学生成绩信息的结构体:

C语言: 知蚁博客

struct student

{

int nID; //学号

char chName[20]; //姓名

float fScores[3]; //3门课的成绩

};

实例程序有点小复杂的,首先我们自己新建一个txt文件,也就是ASCII文件啦,然后写上一些数据,如下:

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函数读取里面的数据,然后通过fwrite写入到新的二进制格式的文件中,这样我们就得到了一个保存上面信息的二进制格式的文件了,下面就是通过fread函数进行数据的读取了。(记住:fread和fwrite一般用于二进制文件的输入输出,ASCII文件还是不要考虑了)。

C++语言: 知蚁博客

#include "stdio.h"

struct student

{

int nID; //学号

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;

}

//二进制文件打开文件 用于写入

pWrite=fopen("stu_scores_bin.txt","wb");

if(NULL == pWrite)

{

fclose(pRead);

return;

}

//fscanf读取数据,fwrite写入数据

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)); //清空数据

//二进制文件打开文件 用于读取

pRead=fopen("stu_scores_bin.txt","rb");

if(NULL == pRead)

{

printf("open file stu_scores_bin.txt failed");

return;

}

//下面有两种fread的读数据方式,将下面的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读取的时候,我们既可以一条条的读取,也可以一次读入多条,这就是为什么参数中有size和count的原因

C语言中把文件里面的几组数据依次读出来分别赋值给几个结构体变量(用链表存储)怎么实现?求具体代码

feof(),用这个函数判断是否读到文件尾了。

fread(buf,size,count,fp);//buf输入数据起始地址,size 每个数据块的大小,count 每次写入的数据块个数,fp 文件指针

写好后是:

while(!feof(fp))

{

fread(temp[i],sizeof(struct use),1,fp);//这个读出来放数组里面

i++;

}

问题是你读的是txt文件,完全可以用fscanf()函数么。

编写线程并发拷贝程序,通过模拟管道文件的实现(管道定义、创建管道、读管道程序和写管道程序程序实现)

#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);

}

//创建子进程

cpid = fork();

if (cpid == -1)

{

//创建子进程失败

perror("fork"); exit(EXIT_FAILURE);

}

if (cpid == 0)

{ /* 子进程中读取管道里面读数据 */

close(pfd[1]); /* 关闭不使用的管道写入端 */

while (read(pfd[0], buf, 1) 0)

{

write(STDOUT_FILENO, buf, 1);//在标准的输出设备上输出读取管到的内容

}

write(STDOUT_FILENO, "\n", 1);

close(pfd[0]);

_exit(EXIT_SUCCESS);

}

else

{ /* 父进程将参数 argv[1]字符串 写入管道 */

close(pfd[0]); /* 关闭不使用的管道读取端 */

write(pfd[1], argv[1], strlen(argv[1]));

close(pfd[1]); /* 关闭管道写入端,此时读取端就会收到 EOF 标志*/

wait(NULL); /* 等待子进程运行结束 */

exit(EXIT_SUCCESS);

}

}


分享名称:c语言pread函数,c语言precede函数
网站网址:http://www.cdkjz.cn/article/dsegodg.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220