C语言文件操作之文件的读写1.docx

上传人:b****8 文档编号:10940545 上传时间:2023-02-23 格式:DOCX 页数:16 大小:187.66KB
下载 相关 举报
C语言文件操作之文件的读写1.docx_第1页
第1页 / 共16页
C语言文件操作之文件的读写1.docx_第2页
第2页 / 共16页
C语言文件操作之文件的读写1.docx_第3页
第3页 / 共16页
C语言文件操作之文件的读写1.docx_第4页
第4页 / 共16页
C语言文件操作之文件的读写1.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

C语言文件操作之文件的读写1.docx

《C语言文件操作之文件的读写1.docx》由会员分享,可在线阅读,更多相关《C语言文件操作之文件的读写1.docx(16页珍藏版)》请在冰豆网上搜索。

C语言文件操作之文件的读写1.docx

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

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1