第6章嵌入式linux文件处理_第1页
第6章嵌入式linux文件处理_第2页
第6章嵌入式linux文件处理_第3页
第6章嵌入式linux文件处理_第4页
第6章嵌入式linux文件处理_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式Linux

C文件处理1.文件简单使用(fgetc()、fputc()、fgets()、fputs())文件格式化读写(fprintf()、fscanf())文件数据块读写(fread()、fwrite())任务描述编一程序,能够创建一个文本文件,文件名由用户从键盘输入。向文件中写入多个字符,直到输入一个“#”,才停止写入。技能目标1.了解文件的处理过程2.学会打开与关闭文件3.能够对文件进行读写操作任务分析关键点1:如何采用C语言创建一个文件,并向该文件中写入字符如果创建的文件名由用户从键盘输入,需要定义一个字符数组

filename[],用来存放创建文本文件名。关键点2:如何操作文件定义文件指针变量fp。打开文件。以写文件方式打开或创建一个文件。如果打开文件失败,输出错误信息并结束程序。文件写入。应用循环结构,从键盘依次输入字符,顺序逐个写入文件,最后输入“#”停止写入。关闭文件。相关知识文件“文件”是一组相关数据的有序集合,如Word文件(扩展名.doc),Excel统计表文件(扩展名.xls),Photoshop图片文件(扩展名.psd)等。文件通常驻留在外部介质上的(如磁盘),在使用时才调入内存。文件的存储从文件编码方式看,文件可分为ASCII码文件和二进制码文件。ASCII文件也称文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。123按文本文件存放123按二进制文件存放磁盘文件内存储器………………文件缓冲区数据存储区读文件(输入)写文件(输出)3.文件指针通过文件指针可以对它所指向的文件进行打开、关闭、读、写等各种操作。定义说明文件指针的一般形式为:FILE

*指针变量

(如:FILE

*fp;)文件指针是FILE类型,文件类型所有的文件函数等定义在stdio.h中,源程序的开头包含stdio.h,就可直接使用文件函数了。4.文件的处理文件的处理必须包括3个过程:打开文件、读或写文件、关闭文件。4.打开文件指针5.打开文件通过fopen函数打开文件,格式为:文件指针名=fopen(文件名,使用文件方式);

“文件名”是被打开文件的文件名或者路径名;“使用文件方式”是指文件的存储类型和操作要求。如:FILE

*fp;fp=fopen("test.txt","r");/*文件名为test.txt,该文件与源程序在同一路径*/fp=fopen(filename,"w")

/*文件名为filename变量中保存的数据*/fp=("c:\\test.txt","rb")/*文件名为test.txt,该文件保存在c盘下*/经常用以下程序段来判断是否打开文件:

if((fp=fopen("test.txt","rb")==NULL){printf("\ncan

not

open

file!");getch();exit(0);}文件的操作方式5文件类型使用方件方式处理方式指定文件不存在时指定文件存在时文本文件r只读出错正常打开w只写建立新文件文件原有内容丢失a追加建立新文件在原文件末尾写数据r+读写出错正常打开w+读写建立新文件文件原有内容丢失a+读写建立新文件在原文件末尾写数据二进制文件rb只读出错正常打开wb只写建立新文件文件原有内容丢失ab追加建立新文件在原文件末尾写数据rb+读写出错正常打开wb+读写建立新文件文件原有内容丢失ab+读写建立新文件在原文件末尾写数据5.文件读写函数字符读写函数 :fgetc(

)和fputc(

)字符串读写函数:fgets(

)和fputs(

)函数调用形式功能返回值fgetcfgetc(fp)从指定的文件中读一个字符读成功则返回所读的字符,否则返回EOFfputcfputc(ch,fp)把一个ch字符写入指定的文件中写入成功则返回写入的字符,否则返回EOFfgetsfgets(str,n,fp)从fp所指的文件中读出n-1个字符送入字符数组str中读成功则返回地址str,文件结束或出错返回EOFfputsfputs(str,fp)把字符串str写入文件中写入成功则返回0,否则返回非06、关闭文件

fclose(文件指针);如:fclose(fp);程序代码/*定义文件指针*/#include

<stdlib.h>#include

<stdio.h>void

main(){FILE

*fp;char

ch,filename[20];printf("input

filename\n");scanf("%s",filename);fp=fopen(filename,"w");/*由用户从键盘输入创建文件名*//*以写文本文件方式打开文件*//*如果打开文件失败,则结束程序*/if(

fp==NULL

){printf("cannotopen

file\n");getchar();exit(0);/*待按任意键继续*//*终止程序*/}ch=getchar();

/*接收执行scanf语句时最后输入的回车符

*/printf("input

charfile

end#:\n");

/*提示输入最后#结束*//*

接收输入的第一个字符*//*字符写入文件中*//*从键盘接收输入的字符*/ch=getchar();while(

ch!=‘#’

){fputc(ch,fp);ch=getchar();}fclose(fp);/*关闭文件*/}程序思考如果要输入的文件名有目录,应如何输入?fp=fopen(filename,"w");其中filename可指定为字符串,打开指定文件

fp=fopen(“filename.txt”,"w");打开当前目录下filename.txt文本文;

fp=fopen(“c:\\mydir\\filename.txt”,"w");打开目录c:\mydir\下文本文件filename.txt。如何将刚创建的文本文件显示在屏幕上呢?#include

<stdlib.h>#include

<stdio.h>void

main(

){FILE

*fp;

/*定义文件指针*/char

ch,filename[10];printf("input

filename\n");scanf("%s",filename); /*由用户从键盘输入创建文件名*/fp=fopen(filename,"r");/*以读文本文件方式打开文件*/{if((fp)==NULL)

/*如果打开文件失败,则结束程序*/printf("cannotopen

file\n");getch();/*待按任意键继续*/exit(0);

/*终止程序*/}ch=getchar();/*接收执行scanf语句时最后输入的回车符*/printf("output

char

file

to

screen:\n");/*提示输入最后#结束*/ch=fgetc(fp);

/*读取第一个字符*/while(

ch!=EOF

){putchar(ch);/*字符输出到屏幕上*/ch=fgetc(fp);

/*读取下一个字符*/}fclose(fp);/*关闭文件*/getchar();}采用fgets()函数如何实现?#include

<stdio.h>#include

<stdlib.h>void

main(){FILE

*fp;

char

str[100];fp

=

fopen("firstFile.txt","r");if(fp

==

NULL){printf("cannot

opent

file!\n");getchar();exit(0);}fgets(str,sizeof(str),fp);printf("%s\n",str);fclose(fp);}任务描述编一个程序,由计算机给出5道20以内2个两位数的加法题,将题目与学生的答题结果保存在“exams.txt”文件中,将正确答案保存在

“answer.txt”文件中。程序设计思路声明两个文件指针变量,分别指向“exams.txt”和“answer.txt”;2.打开两个文件;3.随机生成5道加法题,把题目和学生答案按指定格式写到文件

“exams.txt”,同时将标准答案按一定格式写入文件“answer.txt”中;4.关闭这两个文件。关键点:如何将数据按照一定格式写入指定文件中。格式化读写函数fscanf()和fprintf()fprintf函数与printf函数的功能相似,都是格式化写函数。printf函数是写入磁盘文件。函数调用格式为:fprintf(文件指针,格式字符串,输出表列);例如:fprintf(fp,"%d%c",j,ch);fscanf函数与scanf函数的功能相似,都是格式化读函数。fscanf函数从磁盘文件中读内容。函数调用格式为:fscanf(文件指针,格式字符串,输入表列);例如:fprintf(fp,"%d%s",&j,s);程序代码#include

<stdio.h>#include

<stdlib.h>#include

<time.h>main(){int

i=0,op1=0,op2=0,pupil=0,answer=0,m;FILE

*fp=NULL,*fq=NULL;printf("请输入加法题目总数:");scanf("%d",&m);fp=fopen("d:\\exams.txt","w");if(fp==NULL){printf("Open

error!!!\n");getchar();exit(0);}fq=fopen("d:\\answer.txt","w");if(fp==NULL){printf("Open

error!!!\n");getchar();exit(0);}

srand(time(0));for(

i=1;

i

<=

m;

i++){op1=rand()%11+10;op2=rand()%11+10;printf("%d+%d=",op1,op2);scanf("%d",&pupil);answer=op1+op2;fprintf(fp,"%d+%d=%d\n",

op1,op2,pupil);fprintf(fq

,"%d+%d=%d\n",

op1,op2,answer);}fclose(fp);fclose(fq);}应用拓展编写考试评分程序,对小学生所做的答案进行阅卷。#include

<stdio.h>#include

<stdlib.h>void

main(){int

i=0,

op1=0,

op2=0,

pupil=0,

answer=0,total=0;FILE

*fp=NULL,

*fq=NULL;fp

=

fopen("exams.txt","r");if(fp

==

NULL){printf("cannot

open

file!\n");getchar();exit(0);}fq

=

fopen("answer.txt","r");if(fp

==

NULL){printf("cannot

open

file!\n");getchar();exit(0);}for(i

=

1;

i

<=

3;

i++){fscanf(fp,"%d+%d=%d",&op1,&op2,&pupil);fscanf(fq,"%d+%d=%d",&op1,&op2,&answer);printf("%d+%d=%d

right

answer:%d\n",op1,op2,pupil,answer);if(pupil

==

answer){total

=

total

+

33;printf("right!\n");}else{printf("wrong\n");}}printf("score=%d\n",total);fclose(fp);fclose(fq);getchar();}任务描述编写程序,实现简单的人员信息输入、显示和修改功能,并将输入和修改后的数据写入文件。任务分析1、定义一个结构体数组,存放多个人员的信息;2、声明一个文件指针变量,指向要写入信息的文件并打开该文件;3、获取用户输入的人员信息,并写入指定文件中;4、显示所有人员的信息。5、更新一个人员的信息后,重新在屏幕上输出所有人员的信息。关键点:1.如何将结构数据存入文件?2.如何从文件指定位置开始读写一部分内容?相关知识1、数据块读写函数freed()和fwrite()读数据块函数调用的一般形式为:

fread(buffer,

size,

count,

fp);写数据块函数调用的一般形式为:

fwrite(buffer,

size,

count,

fp);其中:buffer

是一个指针,在fread函数中,它表示存放输入数据的首地址。在fwrite函数中,它表示存放输出数据的首地址。size

表示数据块的字节数。count

表示要读写的数据块块数。fp

表示文件指针。符号常数整数值含义SEEK_SET0文件头SEEK_CUR1当前位置SEEK_END2文件末尾2、文件随机定位函数移动文件指针到文件开始位置:

rewind(文件指针);将文件指针从起始点向后移动。

fseek(文件指针,位移量,起始点);“位移量”表示移动的字节数,通常是n*sizeof(数据类型),即以某一种数据类型的长度为单位。如sizeof(struct

rec)。“起始点”有三种:文件首,当前位置和文件尾。如:fseek(fp,2*sizeof(structrec),0);“0”表示起始点是文件头,可替换为符号常数“SEEK_SET”,即fseek(fp,

2*sizeof(struct

rec),

SEEK_SET)。程序代码#include<stdio.h>#include<stdlib.h>#define

NUM

3void

main(

){FILE*fp1;int

i;struct

rec{char

id[10];charname[15];chardepartment[15];}record[NUM];/*定义结构体类型*/printf("******************

人事信息管理*********************\n");if

((fp1=fopen("infile.txt","wb"))==NULL){printf("cannotopen

file");getchar();exit(0);}printf("Please

input

record

");for(i=0;i<NUM;i++){printf("Pleaseinputid:");scanf("%s",record[i].id);printf("Pleaseinputname:");scanf("%s",record[i].name);printf("Pleaseinputdepartment:");scanf("%s",record[i].department);fwrite(&record[i],sizeof(struct

rec),1,fp1);}fclose(fp1);if((fp1=fopen("infile.txt","rb+"))==NULL){printf("cannotopen

file");getchar();exit(0);}printf("************************************\n");printf("%-10s%-15s%-15s\n","id","name","department");printf("************************************\n");for

(i=0;i<NUM;i++){fread(&record[i],sizeof(struct

rec),1,fp1);printf("%-10s%-15s%-15s\n",record[i].id,record[i].name,record[i].department);}/*以下进行文件的随机读写*/fseek(fp1,2*sizeof(struct

rec),0);

/*定位文件指针指向第三条记录*/fwrite(&record[1],sizeof(struct

rec),1,fp1);/*在第三条记录处写入第二条记录*/rewind(fp1);

/*移动文件指针到文件头*/printf("************************************\n");printf("%-10s%-15s%-15s\n","id","name","department");printf("************************************\n");for

(i=0;i<NUM;i++){/*重新输出文件内容*/fread(&record[i],sizeof(struct

rec),1,fp1);printf("%-10s%-15s%-15s\n",record[i].id,record[i].name,record[i].department);}fclose(fp1);getchar();}技能训练从键盘上输入若干个学生的学号及考试成绩,将这些数据写入磁盘文件y.dat中。(由学号等于0作终止标记)#include

"stdio.h"main(){struct

student{int

num;float

score;};struct

student

stu;FILE

*fp;fp=fopen("y.dat","wb");scanf("%d%f",&stu.num,&stu.score);while(stu.num

!=

0

){fwrite(&stu,sizeof(struct

student),1,fp);scanf("%d%f",&stu.num,&stu.score);}fclose(fp);}练习1.从键盘上输入两个学生的基本信息(姓名,年龄),然后写入到一个文件中,最后读出这两个学生的数据,并显示在屏幕上。2.使用重定位fseek函数,直接读取上述文件中的第2个学生的数据。#include

<stdio.h>#include

<stdlib.h>void

main(){struct

student{char

name[10];int

age;}boya[2],boyb[2],*pa,*pb;FILE

*fp;int

i;fp

=

fopen("students.txt","w+");if(fp

==

NULL){printf("cannot

open

file!\n"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论