1、File *pf = fopen("文件名","打开方式");
文件名可以加路径,两个"\"或者一个"/"
打开方式有这么几种:r只读,r+可读可写,w只写,w+可读可写,会覆盖。a追加,a+可读可写。
2、对于windows系统来讲,都可以带上b,因为在windows系统下,还是有这个区分的。
尤其是这个回车转义字符。因为在 windows下面, 代表回车,而在linux/unix系统的文本文件下, 就代表一个回车。
3、Fopen 和 fclose要成对出现。就跟malloc跟free一样,打开不关,跟申请了不释放一样,都会造成不安全的。所以一定要成对出现。
Fclose(pf);
4、getc() 和 putc() 得到一个 字符,和送出一个字符。
示例用法:
Int main(){ FILE *pf = fopen("a.txt","r"); Char c =0; While( (c=getc(pf))!=EOF){ Printf("%c",c); } Printf(" 读取结束 "); Fclose(pf); Getchar(); Return 0; } Int main(){ FILE *pf = fopen("b.txt","w"); Char c[]="lifei"; Int i = 0; For(;i<strlen(c);i++){ Putc(c[i],pf); } Printf("写入结束 "); Fclose(pf); Getchar(); Return 0; }
5、EOF 的值是-1代表文件结束。函数feof(pf) 用来判定一个文件是否已经到文件结尾了。如果到结尾的话,返回真,否则返回假?
示例用法:
EOF跟上面的第四个点的第一个案例是相同的。
Int main(){ FILE *pf = fopen("a.txt","r"); Char buf[1024] = {0}; while (!feof(pf)){ //如果没有到文件结尾为真就继续执行。 fgets(buf, sizeof(buf), pf); printf(buf); } printf(" 读取结束 "); fclose(pf); getchar(); return 0; }
6、有几个函数总是蒙蔽。。。
Printf()
Sprintf();
Fprintf();
总是不知道谁是谁,干吗用的。现在就来厘清一下他们的关系:
Printf();我们接触最多,是用于输出的,通常情况下直接输出到屏幕。当然也可以输出到文件中。
Sprintf(); 是格式化输出,目标是 一个字符串。它比printf就多一个参数,就是最前面的字符数组,用于接收被输出的对象。
Fprintf();是文件输出,前面加上文件目标就可以了。
例程:
#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)
int main(){
FILE *pf = fopen("a.txt", "r");
FILE *pfw = fopen("content.txt", "w");
char buf[1024] = { 0 };
char forout[100] = { 0 };
int i = 1;
while (!feof(pf)){
memset(buf, 0, sizeof(buf));//这个 在 string.h 里面
fgets(buf, sizeof(buf), pf);
sprintf(forout, "第 %d 行:%s", i++,buf);//格式化输出到字符数组中。
printf(forout);//输出到显示器
fprintf(pfw,"%s",forout);//输出到文件
}
printf(" 读取结束 ");
printf("写出结束 ");
fclose(pf);
getchar();
return 0;
}
7、因为 fprintf();是打印数据到文件所以结合scanf()是从键盘得到数据,fscanf()就是从文件得到数据。
与fgets()一样,fscanf()也是从键盘上获取数据,不过fgets()可以获取文件结尾的回车符号,fscanf()不能获取结尾的回车换行符号。
示例:
#include <stdio.h> #pragma warning(disable:4996) int main(){ FILE *pf = fopen("a.txt","r"); char buf[200] = { 0 }; while (!feof(pf)){ fscanf(pf, "%s", buf); printf("%s ",buf); } printf("读取结束"); fclose(pf); getchar(); return 0; }
8、stat函数
例程:
#include <stdio.h> #include <sys/stat.h> #pragma warning(disable:4996) int main(){ //当你知道 只有跑可以追赶上别人的时候,你会不会跑? struct stat st; stat("main.c", &st); long len = st.st_size; printf("文件大小为:%d ", len); getchar(); return 0; }
打印文件:
#include <stdio.h> #include <sys/stat.h> #pragma warning(disable:4996) int main(){ //当你知道 只有跑可以追赶上别人的时候,你会不会跑? struct stat st; stat("main.c", &st); long len = st.st_size; printf("文件大小为:%d ", len); FILE *pf = fopen("main.c", "r"); char buf[100] = { 0 }; while (!feof(pf)){ fgets(buf, sizeof(buf), pf); printf("%s", buf); } fclose(pf); getchar(); return 0; }
#include <stdio.h> #pragma warning(disable:4996) int main(){ FILE *pf = fopen("a.txt", "r"); if (pf == NULL) return 0; int position = ftell(pf); printf("文件刚刚打开时候的位置%d ",position); char buf[100] = { 0 }; char _4out[100] = { 0 }; int i = 1; while (!feof(pf)){ printf("currentPosition:%d", ftell(pf)); fgets(buf, sizeof(buf), pf); sprintf(_4out, "第 %d 行:%s",i++, buf); printf(_4out); } printf(" 第一遍结束,下面第二遍输出原文 "); printf("值得注意的是:在windows文本文件环境下,一个回车由\r\n两个字符组成,所以第一行有八个字节,等到再次读取的时候当前位置是8. "); fseek(pf, 0, SEEK_SET); while (!feof(pf)){ printf("当前位置:%d", ftell(pf)); fgets(buf, sizeof(buf), pf); printf(buf); } fclose(pf); getchar(); return 0; }