typedef,文件操作

C 语言提供了 typedef 关键字,可以使用它来为类型取一个新的名字。例如:
typedef unsigned char BYTE;
在这个类型定义之后,标识符 BYTE 可作为类型 unsigned char 的缩写
也可以使用 typedef 来为用户自定义的数据类型取一个新的名字。
例如,可以对结构体使用 typedef 来定义一个新的数据类型名字,然后使用这个新的数据类型来直接定义结构变量
struct Books    //typedef struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
}A
int main()
{
    struct Books book;    //A book;
    ...
}    
typedef 与 #define区别
typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名。
typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。


c文件概述
文件是指一组相关数据的有序集合。文件通常是驻留在外部介质(如磁盘)上的,使用时才调用到内存中来。从不同的角度可对文件作不同的分类。
操作系统是以文件为单位对数据进行管理的。
文件的分类:
1)从用户观点:特殊文件(标准输入输出文件或标准设备文件);普通文件(磁盘文件)
2)从操作系统的角度:每一个与主机相连的输入、输出设备看作是一个文件。例如:
    输入文件:终端键盘;输出文件:显示屏和打印机
2)按数据的组织形式:ASCII文件(文本文件):每一个字节放一个ASCII代码;二进制文件:把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放。

打开文件
可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE 包含了所有用来控制流的必要的信息。下面是这个函数调用的原型:
FILE *fopen( const char * filename, const char * mode );
在这里,filename 是字符串,用来命名文件,访问模式 mode 的值可以是下列值中的一个:
模式    描述
r    打开一个已有的文本文件,允许读取文件。
w    打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
a    打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,程序会在已有的文件内容中追加内容。
r+    打开一个文本文件,允许读写文件。
w+    打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+    打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。
如果处理的是二进制文件,则需使用下面的访问模式来取代上面的访问模式:
"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

关闭文件
为了关闭文件,请使用 fclose( ) 函数。函数的原型如下:
 int fclose( FILE *fp );
如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF(-1)。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。

读写文件
字符读写函数:fgetc fputc
字符串读写函数:fgets fputs
数据块读写函数:freed fwrite
格式化读写函数:fscanf fprinf

fputc()函数
调用:fputc(ch,fp);功能:将字符(ch的值)输出到fp所指的文件中去。
注意:用写或读写方式打开一个已存在的文件时将清除原有的文件内容,写入字符从文件首开始。如需保留原有文件内容,必须以追加方式打开文件。
fgetc()函数
调用:ch=fgetc(fp);功能:其意义是从打开的文件fp中读取一个字符并存入ch中。

二进制 I/O 函数
下面两个函数用于二进制输入和输出:
size_t fread(void *ptr, size_t size_of_elements, 
             size_t number_of_elements, FILE *a_file);             
size_t fwrite(const void *ptr, size_t size_of_elements, 
             size_t number_of_elements, FILE *a_file);
这两个函数都是用于存储块的读写 - 通常是数组或结构体。

格式化输入和输出函数(fprintf()和fscanf())
调用:fprintf(文件指针,格式字符串,输出表列);fscanf(文件指针,格式字符串,输出表列)
例如:(fp,"%d",i)

fseek()函数
功能:可以移动文件指针到指定位置读,或插入写:
int fseek(文件类型指针,位移量,起始点);
起始点:
文件开头    SEEK_SET    0
文件当前位置    SEEK_CUR    1
文件末尾    SEEK_END    2
位移量:以起始点为基点,向前移动的字节数。
实例:
#include <stdio.h>
int main(){   
    FILE *fp = NULL;
    fp = fopen("test.txt", "r+");  // 确保 test.txt 文件已创建
    fprintf(fp, "This is testing for fprintf...\n");   
    fseek(fp, 10, SEEK_SET);
    if (fputc(65,fp) == EOF) {
        printf("fputc fail");   
    }   
    fclose(fp);
}
执行结束后,打开 test.txt 文件:
This is teAting for fprintf...


扩展:位运算
逻辑运算符:
&:位 ‘与’ ;
^: 位 ‘异或’
|: 位 ‘或’
~: 位 ‘非’,取反

移位运算符:
<<: 左移
>>: 右移
 

上一篇:PPAD和PPA的提出——Papadimitriou, 1992,论文思路总结翻译


下一篇:BMP图片的旋转以及BMP转YUV(4:2:0)