C文件操作就这么简单
c文件操作就这么简单
文件操作,稍微一总结.。
FILE是一个结构体类型,在TC和VS中定义不相同,他的作用就是在fopen()之后保存了打开文件的信息。也就是说操作系统帮我们完成了,我们不用管,大大降低了难度吧。
首先我们考虑下对文件的操作,文件类型分为文本和二进制。读写文件的函数一般前面有个f,也就表示file,open,fopen,read,fread,很容易记住。
打开文件后要读写,当前其中关于判断打开是否成功,读写是否成功。。。。我就省略了。打开时设置打开后的操作模式,这个模式直接保存在了FILE结构体的flag中。打开就一个fopen,然后我们先考虑读吧,读写的函数都比较多:
fgetc(),fgetchar(),getc();fgets(),gets(),fread(),fscanf();
前三个是读取单个字符,后三个是读取字符串,一般都是结合while判断是否到了EOF来处理。fscanf()和fprintf()较为复杂,也容易搞混淆,可以这么理解,
fscanf(fp,"%s",name); //从fp指定的文件中以字符串保存在name变量中
fprintf(fp,"%s",name); //将name以字符串的形式保存到fp指定的文件中
fread(a,b,c,d)函数功能强大,可以这么理解,从d中读取c个b长度的数据保存到a中。如:fread(buf, strlen(msg)+1, 1,fp);
fwrite(a,b,c,d)函数功能强大,可以这么理解,从a中读取c个b长度的数据保存到d中。只是a和d位置变换了。如:fwrite(buf, strlen(msg)+1, 1,fp);
有了以上的函数你可以简单的读一个文件了,但是如果想读某个位置,怎么办?读写文件都是通过一个指针来实现的FILE *fp;在fp中保存了一个指向的当前位置的指针,我们要得到这个位置,就用ftell()函数。得到其与文件头的偏移量。如:1,21,23,14,45,63;fp在fopen时指向了1,然后fgetc()呀什么的,就读出了23,当然你通过ftell()就可以知道目前的位置在第三个。如果我们要取离开始位置第4个的数据呢?你可以使用rewind(fp);复位到文件头,在ftell()==4,然后开始读取。当然还有一个更好用的函数fseek(FILE指针,偏移字节数,起始位置);这个函数就相当灵活了,起始位置可以有三个选项:文件开头(SEEK_SET),相当于rewind()了一下;当前位置(SEEK_CUR);文件结尾(SEEK_END)。
综合以上你是不是可以灵活的读一个文件了,对于写的函数:
fputc(),fputchar(),putc();fputs(),puts(),fwrite(),fprintf();和读都是一一对应的,关于他们怎么使用,可以通过看其参数都能明白。
OK,到此读写是不是就这么回事呢,还有一小小点,gets,fgets....
相关文档:
1.区别(主要的):指针需要增加一次额外的提取操作
编译器为每个变量分配一个地址(左值)。这个地址编译时可知,而且该变量在运行时一直保存于这个地址。相反,存储于变量中的值(它的右值)只有在运行时才可知。如果需要用到变量中存储的值,编译器就发出指令从地址读入变量值并将它存于寄存器中。
  ......
VC中下面几个结构体大小分别是多少呢
struct MyStruct
{
double m4;
char m1;
int m3;
};
struct MyStruct {
char m1;
double m4;
int m3;
};
#pragma pack(push)   ......
- 要使用断言对函数参数进行确认
- 为了不必要的开销,可以仅使用断言,而不要return
网上有人写的strcpy代码,做了太多的出错处理,导致性能低下,其实没必要,用assert就行了,这样在debug模式下能捕捉错误,release下又不影响性能。
- 书上提供的memcpy的范例
void memcpy(void* pvT ......
网马加密中,目前有个function(p,a,c,k,e,d)的,非常讨厌,我也是深恶痛绝,记得我刚开始碰到它的时候,拼命地读函数,那个叫痛苦啊,磕磕绊绊地勉强搞了出来。今天,突然看见了function(p,a,c,k,e,d)的解密代码,高兴都来不及
<script>
a=62;
function encode() {
var code = document.getElementById('code' ......
在C语言里,全局变量如果不初始化的话,默认为0,也就是说在全局空间里:
int x =0; 跟 int x; 的效果看起来是一样的。但其实这里面的差别很大,强烈建议大家所有的全局变量都要初始化,他们的主要差别如下:
编译器在编译的时候针对这两种情况会产生两种符号放在目标文件的符号表中,对于初始化的,叫强符号,未初始化的 ......