锂 さんのプロフィール向锂的Spaceフォトブログリスト ツール ヘルプ

ブログ


12月14日

The C Programming Language --- 输入输出

1.        C语言把文件看作字节流,分为二进制流或者字节流,分别对应二进制文件和文本文件。二进制文件把内存中的数据按其在内存中存放形式原样输出到磁盘上文本文件把文件看作是一个一个的字符序列。如果要在文件中读写数值型数据,应该在打开文件时指定其打开类型指定为二进制流。

 

2.        File * fopen(文件路径,打开模式) , 打开不成功时返回NULL

       <1>文本文件

       r   只读   为输入打开一个文件文件

       w”    只写:为输出开一个文件文件

       a”    追加:  向文本文件尾增加数据

       “r+”    读写:为读/写打开一个文本文件

       “w+”    读写:  为读/写建立一个新的文件文件

       “a+”    读写:为读/写打开一个文本文件。 

       <2>二进制文件

       “rb”     只读:为输入打开一个二进制文件

       “wb”    只写:为输出打开一个二进制文件

       “ab”     追加:向二进制文件尾增加数据

       “rb+”    读写  为读/写打开一个二进制文件

       “wb+”   读写  为读/写建立一个新的二进制文件

       “ab+”    读写 为读写打开一个二进制文件。

 

3.        C提供了一组函数来访问文件,分别为

       fgetc() & fputc()  à 读写一个字符

       fgets() & fputs()      à 读写一行字符

       fprintf() & fscanf()  à 按格式访问文件

       以上三组函数提供了十分强大方便的按既定格式访问文本文件的功能

 

          fread()  & fwrite() 

       主要用来实现二进制文件的读写,其作用是把联系地址空间的若干个字节的 二进制数据写入文件;实际使用的时候常常结合<memory.h>中的memcpy()函数来把不连续分布的数据先拷贝到一个连续分配空间的数组中,然后再写入文件。

 

4.        每个程序在开始时自动获得三个文件句柄,stdin,stdout,stderr分别对应标准输入,标准输出,标准错误;所以可以利用这三个句柄和基本的文件流访问函数getc()等实现getchar()等标准输入输出功能,而实际上getchar()putchar()的实现就是宏

       #define getchar()         getc(stdin)

       #define putchar(_c)       putc((_c),stdout)

       printf(const char * format , …)可以实现为

          fprintf(stdout,const char * format,…);

 

5.        fseek()函数用来调整文件指针,其函数原型为

       int fseek( FILE *stream, long offset, int origin );

       其中offset为从origin位置开始移动的字节数,origin定义如下常量

       SEEK_CUR        文件当前位置

       SEEK_END        文件结尾

       SEEK_SET          文件开始

 

       ftell:返回当前文件的指针位置,是相对于文件开头的位移量。返回值为-1L表示出错

 

    feof()函数用来判断是否到达文件尾

 

6.        fclose()用来关闭文件句柄,如果有缓冲数据,则扫出缓冲数据至外存!因为每个程序都有最大打开文件的限制,所以对于不再使用的文件句柄应该及时释放。特别应该引起注意的是,文本文件一般提供了缓冲。

 

   

7.        对于结构体,在VCGCC的默认设置下编译出的程序,却有一个值得注意的问题——结构体的对齐。结构体的对齐是编译器为加快程序运行,在结构体中填入一些空白字节,是的结构体成员按一定规则对齐。例如结构:

        struct MyStruct {

       char a;

       int  b;

        };

    按一般计算其类洗过那大小应为5个字节,但在上述编译器默认设置下,使 sizeof计算出的结构体类型大小为8个字节多余字节的产生原因在于编译       器对结构体成员对齐字节数的设置的不同,VCGCC(MinGW)     的默认设置为8字节对齐,所以需要改变其默认的对齐字节数为按单字节对齐,即可以解决上述问题。具体方法是在代码头中加入:

      #pragma pack(1)

       即可。此后使用sizeof计算出的结构体大小即为各成员大小的总和。