C语言文件操作之文件的读写1.docx
《C语言文件操作之文件的读写1.docx》由会员分享,可在线阅读,更多相关《C语言文件操作之文件的读写1.docx(16页珍藏版)》请在冰豆网上搜索。
C语言文件操作之文件的读写1
C语言文件操作之----文件的读写
一.下获取环境变量
#include<>
#include<>
intmain(void)
{
char*path,*ptr;
inti=0;
puts("Thisprogramistogettheinformationofenviron.");
while(environ[i])
printf(">>%s\n",environ[i++]);
printf("Pressanykeytoquit...");
getch();
return0;
}
二.获取CapsLock键状态
#include<>
#include<>
intmain()
{
intvalue=0;
printf("\n\ThecurrentstatusoftheCapsLockkeyis:
");
value=peekb(0x0040,0x0017);
if(value&64)
{
printf("\n\nTheCapsLockkeyis:
on");
sleep(10);
}
else
{
printf("\n\nTheCapsLockKeyis:
off");
sleep(10);
}
}
运行Windows系统版本
当文件按指定的工作方式打开以后,就可以执行对文件的读和写。
下面按文件的性质分类进行操作。
对文本文件来说,可按字符读写或按字符串读写;
对二进制文件来说,可进行成块的读写或格式化的读写。
1.读写字符
C提供fgetc和fputc函数对文本文件进行字符的读写,其函数的原型存于头文件中,格式为:
intfgetc(FILE*stream)
fgetc()函数从输入流的当前位置返回一个字符,并将文件指针指示器移到下一个字符处,如果已到文件尾,函数返回EOF,此时表示本次操作结束,若读写文件完成,则应关闭文件。
intfputc(intch,FILE*stream)
fputc()函数完成将字符ch的值写入所指定的流文件的当前位置处,并将文件指针后移一位。
fputc()函数的返回值是所写入字符的值,出错时返回EOF。
[例8-2]将存放于磁盘的指定文本文件按读写字符方式逐个地从文件读出,然后再将其显示到屏幕上。
采用带参数的main(),指定的磁盘文件名由命令行方式通过键盘给定。
#include<>
main(intargc,char*argv[])
{
charch;
FILE*fp;
inti;
if((fp=fopen(argv[1],"r"))==NULL)/*打开一个由argv[1]所指的文件*/
{
printf("notopen");
exit(0);
}
while((ch=fgetc(fp))!
=EOF)/*从文件读一字符,显示到屏幕*/
putchar(ch);
fclose(fp);
}
程序是一带参数的main()函数,要求以命令行方式运行,其参数argc是用于记录输入参数的个数,argv是指针数组,用于存放输入参数的字符串,串的个数由argc描述。
假设我们指定读取的文件名为,并且列表文件内容就是源程序。
经过编译和连接生成可执行的文件。
运行程序,输入的命令行方式为:
c:
\tc>-2L
上述程序以命令行方式运行,其输入参数字符串有两个,即argv[0]="c:
\tc>l8-2"、argv[1]="",argc=2。
故打开的文件是。
程序中对fgetc()函数的返回值不断进行测试,若读到文件尾部或读文件出错,都将返回C的整型常量EOF,其值为非零有效整数。
程序的运行输出为源程序本身:
c:
\tc>-2L
#include<>
main(intargc,char*argv[])
{
charch;
FILE*fp;
inti;
if((fp=fopen(argv[1],"r"))==NULL)/*打开一个由argv[1]所指的文件*/
{
printf("notopen");
exit(0);
}
while((ch=fgetc(fp))!
=EOF)/*从文件读一字符,显示到屏幕*/
putchar(ch);
fclose(fp);
}
[例8-3]从键盘输入字符,存到磁盘文件中:
给出原文件代码换成图片亲自运行后有误,所以附上自己调适的代码
自己调试的代码
#include<>
#include<>
intmain()
{
FILE*fp;/*定义文件变量指针*/
charch;
if((fp=fopen("","w"))==NULL)/*以只写方式打开文件*/
{
printf("cannotopenfile!
\n");
exit(0);
}
while((ch=fgetchar())!
='\n')/*只要输入字符非回车符*/
fputc(ch,fp);/*写入文件一个字符*/
fclose(fp);
return0;
}
程序通过从键盘输入一以回车结束的字符串,写入指定的流文件,文件以文本只写方式打开,所以流文件具有可读性,能支持各种字符处理工具访问。
简单地说,我们可以通过DOS提供的type命令来列表显示文件内容。
运行程序:
hello,iloveyou
在DOS操作系统环境下,利用type命令显示文件如下:
c:
\>type
hello,iloveyou
2.读写字符串
C提供读写字符串的函数原型在头文件中,其函数形式为:
Char*fgets(char*str,intnum,FILE*stream)
fgets()函数从流文件stream中读取至多num-1个字符,并把它们放入str指向的字符数组中。
读取字符直到遇见回车符或EOF(文件结束符)为止,或读入了所限定的字符数。
intfputs(char*str,FILE*stream)
fputs()函数将str指向的字符串写入流文件。
操作成功时,函数返回0值,失败返回非零值。
[例8-4]向磁盘写入字符串,并写入文本文件:
#include<>
#include<>
main()
{
FILE*fp;
charstr[128];
if((fp=fopen("","w"))==NULL)/*打开只写的文本文件*/
{
printf("cannotopenfile!
");
exit(0);
}
while((strlen(gets(str)))!
=0)
{/*若串长度为零,则结束*/
fputs(str,fp);/*写入串*/
fputs("\n",fp);/*写入回车符*/
}
fclose(fp);/*关文件*/
}
运行该程序,从键盘输入长度不超过127个字符的字符串,写入文件。
如串长为0,即空串,程序结束。
输入:
Hello!
Howdoyoudo
Good-bye!
运行结束后,我们利用dos的type命令列表文件:
c:
\tc>type
Hello!
Howdoyoudo
Good-bye!
这里所输入的空串,实际为一单独的回车符,其原因是gets函数判断串的结束是以回车作标志的。
[例8-5]从一个文本文件中读出字符串,再写入另一个文件。
C语言文件读写练习_一个文件复制程序
阅读
这几天浏览了很多人的博客,发现似乎有这么个规律:
大神的blog中代码很少甚至没有一行代码,且大多是写一些认真思考出来的东西,而像我这样的新手blog好多都是"贴代码",有时候连两句"废话"都懒得扯。
正文
这次整理的是我第一次用C写的文件复制程序。
那时候为了理解 流(Stream) 这个东西也算是费了心思了,印象最深刻的便是把流比作管道,数据通过管道流通。
到现在也不敢说完全理解,对新手而言,抽象的概念远不如具体的代码让人安心。
对这些抽象的概念,我的一点点体会就是, 一时不能理解没什么关系,多写代码体验一下,多思考,慢慢的也就悟出来了
旧文中是按文本流复制的,如果仅仅是复制文本文件还行,
但是如果想要复制非文本文件,可能会出现问题。
经测试,即使文件打开方式是"rb","wb"也不能正常复制exe文件,原因应该在那个while循环上了。
因此这次改成以二进制流的形式复制。
这样应该能用于所有类型的文件。
旧文中是一次复制一个字符,一般来说,这样的效率不高。
就像上一篇 中那样,频繁地调用IO函数,性能损失特别大。
所以这次同样尝试使用"缓存",我的方案是使用fread() 和fwrite()函数按字节块复制。
重新写的程序代码还是要贴出来的,呵呵:
#include<>
/*******************
*CopyFile:
此函数用于复制指定的文件到指定的位置,
* 功能算是Windows下的copy,或linux下的cp.
*这里的实现用了fread()和fwrite(),二进制流的形式读写
*返回值:
非负数:
复制的字节数.
* 小于0的数:
请检查文件名是否正确输入,是否合法.
*******************/
longCopyFile(constchar*file_1,constchar*file_2)
{
FILE*pfRead=fopen(file_1,"rb"); FILE*pfWrite=fopen(file_2,"wb"); if(NULL==pfRead||NULL==pfWrite)
{
fclose(pfRead);
fclose(pfWrite);
return-1;
}
longbytesCount=0;long最大可以表示不超过2GB的文件
/*因为C没有byte类型,所以这里用char替代
*貌似对大多数机器来说,char都是单字节
*/
intarrLen=1024; intcopiedLen; fclose(pfRead);
fclose(pfWrite);
returnbytesCount;
}
/*此程序从命令行参数获取文件名(路径):
* C:
\>application_namefile1_namefile2_name
*Example:
* C:
\>e:
\f:
\
*必须存在,可以不存在,会自动创建文件.
*如果已存在,会被覆盖掉.
* (友情提示:
注意保存重要的文件,别被"盖"了!
)
**/
intmain(intargc,char*argv[])
{
if(argc==3)
{
char*f1=argv[1];
char*f2=argv[2];
printf("CopyFile1:
%s\nToFile2:
%s\n",f1,f2);
puts("Copying......");
longbytesCount=CopyFile(f1,f2);
if(bytesCount<0)
{
puts("Failtocopy.");
}
else
{
printf(" %ldbyteswroteinto%s.\n",bytesCount,f2);
}
}
else
{
puts("parameterserror");
}
在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。
2).fgets函数也有返回值,其返回值是字符数组的首地址。
·fputs函数的功能是向指定的文件写入一个字符串,其调用形式为:
fputs(字符串,文件指针)其中字符串可以是字符串常量,也可以是字符数组名或指针变量,
例如:
fputs(“abcd“,fp);其意义是把字符串“abcd”写入fp所指的文件之中。
【程序示例】
#include<>
#include<>
main()
{
charstr[11];
FILE*fpr=fopen("","r");
FILE*fpw=fopen("","a+");
if(NULL==fpr){
printf("openfailed!
\n");
exit
(1);
}
if(NULL==fpw){
printf("openfailed!
\n");
exit
(1);
}
printf("fileopensuccessed!
\n");
fgets(str,11,fpr);
printf("%s\n",str);
fputs(str,fpw);
fclose(fpr);
fclose(fpw);
exit(0);
}
(3)数据块读写函数:
fread和fwrite
C语言还提供了用于整块数据的读写函数。
可用来读写一组数据,如一个数组元素,一个结构变量的值等。
·读数据块函数fread调用的一般形式为:
fread(buffer,size,count,fp);
·写数据块函数fwrite调用的一般形式为:
fwrite(buffer,size,count,fp);
其中buffer是一个指针,在fread函数中,它表示存放输入数据的首地址。
在fwrite函数中,它表示存放输出数据的首地址。
size表示数据块的字节数。
count表示要读写的数据块块数。
fp表示文件指针。
【程序示例】
#include<>
#include<>
#defineMAXSIZE2
structstu{
charname[20];
intage;
charaddr[20];
}boy[MAXSIZE];
main()
{
FILE*fp=fopen("","w+");
structsturboy[MAXSIZE];
inti;
inttemp=0;
if(NULL==fp){
printf("openfailed!
\n");
exit
(1);
}
printf("Fileopensuccessed!
\n");
printf("inputdata:
");
for(i=0;i scanf("%s%d%s",boy[i].name,&boy[i].age,boy[i].addr);
}
for(i=0;i printf("%s %d %s\n",boy[i].name,boy[i].age,boy[i].addr);
}
fwrite(boy,sizeof(structstu),MAXSIZE,fp);
rewind(fp);
fread(rboy,sizeof(structstu),MAXSIZE,fp);
for(i=0;i printf("name:
%s age:
%d addr:
%s\n",rboy[i].name,rboy[i].age,rboy[i].addr);
}
fclose(fp);
exit(0);
}
(4)格式化读写函数:
fscanf和fprinf
fscanf函数,fprintf函数与scanf和printf函数的功能相似,都是格式化读写函数。
两者的区别在于fscanf函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。
这两个函数的调用格式为:
·fscanf(文件指针,格式字符串,输入表列);
·fprintf(文件指针,格式字符串,输出表列);
例如:
fscanf(fp,"%d%s",&i,s);
fprintf(fp,"%d%c",j,ch);
【示例程序】
#include<>
#include<>
#defineMAXSIZE2
structstu{
charname[20];
intage;
charaddr[20];
}boy[MAXSIZE];
main()
{
FILE*fp=fopen("","w+");
structsturboy[MAXSIZE];
inti;
if(NULL==fp){
printf("openfailed!
\n");
exit
(1);
}
printf("enterdata:
\n");
for(i=0;i scanf("%s%d%s",boy[i].name,&boy[i].age,boy[i].addr);
}
for(i=0;i fprintf(fp,"%s%d%s\n",boy[i].name,boy[i].age,boy[i].addr);
}
for(i=i;i fscanf(fp,"%s%d%s",rboy[i].name,&rboy[i].age,rboy[i].addr);
}
fclose(fp);
exit(0);
}