C/C++学习笔记27:(二)C文件系统操作

在C文件系统操作的学习中可以与Linux应用程序开发联系起来,Linux应用程序开发中也涉及到了大量的文件操作。可以对此进行比较。

文件的打开与关闭

文件打开:

函数原型:fp=fopen(filename,flags)

说明:如果不能实现“打开”的任务,fopen函数将会带回一个出错信息。出错的原因可能是用“r”方式打开一个并不存在的文件;磁盘出故障;磁盘已满无法建立新文件等。此时open函数将返回一个空指针值NULL(stdio.h中被定义为0),因此可以用如下方法打开一个文件:

if((fp=fopen("file1","r")==NULL)
{
printf("cannot open this file\n");
exit(0);
}

文件关闭:

在使用完一个文件后应该关闭它,以防止它再被误用。

“关闭”就是使文件指针变量不指向该文件。

函数原型:fclose(fp);前面我们曾把打开文件时所带回的指针赋给了fp,现在通过fp把该文件关闭,即fp不再指向该文件。

fclose函数也带回一个值,当顺利地执行了关闭操作,则返回值为0;否则返回eof(-1).


拓展与比较:

在Linux的文件变量有两种方法可以实现:

1)依赖于Linux操作系统的Linux系统调用方式

2)C语言库函数;其实与操作系统是独立的,在任何操作系统下,使用C语言库函数操作文件的方法是相同的

比较:

1)系统调用的方式:

文件描述符:在Linux系统中,所有打开的文件都有一个文件描述符。文件描述的本质是一个非负整数,当打开一个文件时,该整数由系统分配。

系统调用的接口:

文件打开:

<span style="font-family:KaiTi_GB2312;font-size:18px;">int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode)</span>
文件关闭:
<span style="font-family:KaiTi_GB2312;font-size:18px;">int close (int fd);//fd是文件描述符</span>
2)库函数:

文件打开:

<span style="font-family:KaiTi_GB2312;font-size:18px;">FILE *fopen(const char* filename,const char *mode);
</span>
文件关闭:

<span style="font-family:KaiTi_GB2312;font-size:18px;">int fclose(int fd);</span>


文件的读写

常用的读写函数有如下所示:

fputc函数

函数原型:fputc(ch,fp)

函数意义:ch是要输出的字符,它可以是一个字符常量,也可以是一个字符变量。fp是文件指针变量。fputc(ch,fp)函数的作用是:将字符ch输出到fp所指向的文件中去。fputc函数也带回一个值:如果输出成功,则返回值就是输出字符;如果输出失败,则返回一个EOF;

fgetc函数

函数原型:ch=fgetc(fp);

函数意义:从指定的文件读入一个字符,该文件必须是以读或者读写的方式打开

    fp是文件型指针变量,ch为字符型变量

   fgetc函数带回一个字符,赋给ch。如果在执行fgetc函数读字符时遇到文件结束符,函数返回一个文件结束标致EOF(-1)。

e.g1:从一个磁盘文件顺序读入字符并在屏幕上显示出来

ch=fgetc(fp);
while(ch!=EOF)
{putchar(ch);
ch=fgetc(fp);
}

拓展与补充:字符数据的输入与输出

C语言本身不提供输入输出语句,输入与输出操作是由C函数库中的函数来实现的。不把输入输出作为C语句的目的是使C语言编译系统简单,没有输入输出语句就可以避免在编译阶段处理与硬件相关的问题。

putchar函数:就是向终端输出一个字符

函数原型:putchar(c)

getchar函数:从终端输入一个字符

函数原型:getchar();函数没有参数

putchar与fputc的关系:

putchar是从函数fputc派生出来的,putchar(c)是在stdio.h文件中用预处理命令#define定义的宏

# define putchar(c) fputc(c,stdout);

关于stdout、stdin、stdout

在程序运行时,系统自动打开3个标准文件:标准输入、标准输出、标准出错输出。通常这3个文件都与终端相联系。因此我们所用到的从终端输入或输出都不需要打开终端文件。

系统自动定义了3个文件指针stdin、stdout、stderr;分别指向终端输入、终端输出和标准出错输出


实例1:从键盘输入一些字符,逐个把他们送到磁盘上去,直到输入一个“#”为止。(也是Linux下的文件编程)

#include <stdio.h>
#include <stdlib.h>
void main()
{FILE *fp;
  char ch,filename[10];
  scanf("%s",filename);
  if((fp=fopen(filename,"w")==NULL)
  {printf("cannot open file\n");
    exit(0);} //若为NULL,则终止程序
  ch=getchar();//用来接受上个语句的回车符
  ch=getchar();
  while(ch!='#')
      {
        fputc(ch,fp);
        putchar(ch);
        ch=getchar();//用来接受上个执行语句的回车符
        }
     putchar(10);//向屏幕输出一个换行符
     fclose(fp);
   }

fread函数和fwrite函数

getc和putc函数可以用来读写文件中的一个字符。但常常要求读入一组数据,这时候就利用提供的fread和fwrite两个函数来操作。

函数原型:

fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
说明:buffer是一个指针,对于fread来说,它是读入数据的存放地址,对于fwrite来说,是要输出数据的地址。

size:要读写的字节数

count:读多少个size字节的数据项


fscanf函数和fprintf函数

fscanf函数、fprintf函数与scanf函数、printf函数有什么区别?
其实他们都是格式化读写函数,只是fscanf函数和fprintf函数的读写对象不是终端而是磁盘文件。

函数原型:


fprintf(文件指针,格式字符串,输出列表);
fscanf(文件指针,格式字符串,输入列表);

其他的一些函数:putw、getw、fgets、fputs

putw(10,fp):从磁盘文件读写一个字(整数)

i=getw(fp):从磁盘文件中读一个整数到内存,赋给整型变量i

fgets与fputs:从指定文件中读入或写入一个字符串

函数原型:fgets(str,n,fp);

fputs("china",fp);


文件定位


文件中有一个位置指针,指向当前读写的位置。如果顺序读写一个文件,每次读写一个字符,则读写完一个字符以后,该位置指针自动移动指向下一个字符位置。如果想改变这样的规律,强制使位置指针指向其他所指定的位置。

rewind函数:

函数原型:rewind(fp);

函数意义:使位置指针重新返回文件的开头,此函数没有返回值。

fseek函数:
函数原型:int fseek(FILE*stream,long offset,int origin);

函数功能:stream:文件指针

offset:偏移量,正数表示正向便宜,负数表示负向偏移

origin:设定文件从哪里开始偏移,可能取值有SEEK_CUR:文件开头,SEEK_END:文件结尾,SEEK_SET:文件开头。

ftell函数

函数功能:得到流式文件中的当前位置,用相对于文件开头的位移量表示。 

展开阅读全文

没有更多推荐了,返回首页