一行一行读取:
#include <stdio.h>
int main(){
FILE *file ;
char buf[1024];
file = fopen("student.txt","r");
while(fgets(buf,sizeof(buf),file) !=NULL){
fputs(buf,stdout);
}
fclose(file);
fclose(file);
return 0;
}
fopen 参数
rewind() 函数:rewind(文件指针)使位置指针重新返回到文件开头,无返回值
ftell() 得到当前文件指针位置
文件复制
#include<stdio.h>
int main(int argc,char *argv[]){
FILE *sfp,*dfp;
char buf[1024];
if(argc<3){
printf("./mycp src name");
return 1;
}
sfp = fopen("./a.txt","r");
if(sfp==NULL){
printf("scr open error");
return 1;
}
dfp = fopen("./b.txt","w");
if(dfp ==NULL){
printf("dest open error");
return 1;
}
while(NULL!=fgets(buf,sizeof(buf),sfp)){
fputs(buf,dfp);
}
fclose(sfp);
fclose(dfp);
return 0;
}
feof(文件指针) 判断文件位置指针是否在文件末尾
返回值:
函数返回为1的时候表示在文件末尾,为0表示还未到文件末尾
fof的坑
例如,有一个文件指针fp,文件中有字符串“hello world”:
int c=0;
while( !feof(fp) )
{
int c=fgetc(fp);
printf("%c: %x \n", c, c);
}
上面的代码除了输出 hello 外,还会输出一个结束字符EOF(EOF是fgetc函数的返回值,并不是文件中存在EOF)。其原因就是当内部位置指针指向结尾时,还要执行一次读操作,文件结束标识才会被设置。
对上面代码进行更改:
int c;
c=fgetc(fp);
while( !feof(fp) )
{
printf("%c: %x \n", c, c);
c=fgetc(fp);
}
上面的代码只输出“hello”不输出文件结束符EOF。当文件内部位置指针指向结束位置时,先执行一次读操作,设置文件结束标识,while循环立即结束。
fprintf() fscanf() 对文件格式化读写
以数据块方式读写文件:fread() 和 fwrite()
函数对磁盘文件读写,使用方便
fread() fwrite()的优势是操作结构体。 返回的是元素个数
在内存与磁盘频繁交换数据的情况下,最好用fread() 和fwrite()函数。
#include <stdio.h>
struct STU {
int id;
char sex;
char name[20];
};
int main(void)
{
FILE *fp;
char buf[1024];
int res;
struct STU a = {123, 'm', "aaa"}, b;
fp = fopen("demo.txt", "w+");
//res = fwrite(&a, 1, sizeof(a), fp);
res = fwrite(&a, sizeof(a), 1, fp);
printf("fwrite res %d\n", res);
rewind(fp);
res = fread(&b, sizeof(b), 1, fp);
printf("fread res %d\n", res);
printf("%d\t%c\t%s\n", b.id, b.sex, b.name);
/*
fread(buf, 1, 10, fp); //fgetc
fwrite(buf, 1, 10, stdout); //fputc
*/
fclose(fp);
return 0;
}