C语言最常用文件操作,个人总结笔记,终于把书上的都学会了

 

声明:从怎么打开一个文件开始,一步步走,文件指针的操作,读取写入操作等等

           我认为百度的资料最准确,所以把百度关于函数的介绍一起引用了过来


1、fopen()

FILE *fp;
//其意义是在当前目录下打开文件file a,只允许进行“读”操作,并使fp指向该文件。
if((fp=fopen("a.txt","r"))==NULL)
{
    printf("\nerror on open a.txt file!");
    getch();
    exit(1);
}
这段程序的意义是,如果返回的指针为空,表示不能打开C盘根目录下的a.txt文件,则给出提示信息“error on open a.txt file!”
//下一行getch()的功能是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待,只有当用户从键盘敲任一键时,程序才继续执行,因此用户可利用这个等待时间阅读出错提示。敲键后执行exit(1)退出程序。

 

2、fscanf()

返回值:整型,成功返回读入的参数的个数,失败返回EOF(-1)。

 


3、fseek()

 


 

4、rewind()


 5、ftell(fp)

 

用于得到文件位置指针当前位置相对于文件首的偏移字节数

返回-1L,表示调用出错

    i=ftell(fp);
    if(i==-1L)
        printf("error\n");

    fseek(fp, 0L,SEEK_END); //指针放在文件尾
    len =ftell(fp);        //指出指针的位置,即文件字节数,文件大小

#include <stdio.h>
int main(void)
{
    FILE *stream;
    stream = fopen("MYFILE.TXT", "w+");
    fprintf(stream, "This is a test");
    printf("The file pointer is at byte \%ld\n", ftell(stream));
    fclose(stream);
    return 0;
}

 


6、fputs(str,fp)


7、fgets(buf, bufsize, fp)

函数原型

char *fgets(char *buf, int bufsize, FILE *stream);//注意最多读取的时bufsize-1个字符,最后一个默认放 \0 了;  

 

参数

*buf: 字符型指针,指向用来存储所得数据的地址。

bufsize: 整型数据,指明存储数据的大小。

*stream: 文件结构体指针,将要读取的文件流。

 

返回值

  1. 成功,则返回第一个参数buf;

  2. 在读字符时遇到end-of-file,则eof指示器被设置,如果还没读入任何字符就遇到这种情况,则buf保持原来的内容,返回NULL;

  3. 如果发生读入错误,error指示器被设置,返回NULL,buf的值可能被改变。 [1] 

#include<stdio.h>
int main()
{
	FILE *fp;
	char a[30],b[30],c[30];
	
	fp=fopen("3.txt","r+");
	
	fgets(a,6,fp);	
	printf("%s\n",a);
	
	fgets(b,20,fp);
	printf("%s\n",b);
	
	fgets(c,23,fp);
	printf("%s",c);
	return 0;
}

例:
如果一个文件的当前位置的文本如下
Love, I Have
Since you can do it.
如果用
fgets(str1,6,file1);去读取
则执行后str1 = "Love," ,读取了6-1=5个字符
这个时候再执行fgets(str1,20,file1)则执行后str1 = " I Have\n"   继续读取的原因时缓冲区总是以NULL结尾,没有读完,下一次继续读。!!!!!重点

而如果
fgets(str1,23,file1);
则执行str1="Love ,I Have",读取了一行(包括行尾的'\n',并自动加上字符串结束符'\0'),当前文件位置移至下一行,虽然23大于当前行上字符总和,可是不会继续到下一行。而下一次调用fgets()继续读取的时候是从下一行开始读。

最后那个A没有读取,因为bufsize只有1,放了\0

注意:空格也是一个字符。


8、fgetc(fp

#include<stdio.h>
void main()
{
    FILE *fp;
    int c;
    fp=fopen("exist","r");
    while((c=fgetc(fp))!=EOF)  //用EOF来检验文件末尾*******************************重点
        printf("%c",c);
    fclose(fp);
}

 

9、fputc(ch,fp

#include <stdio.h>
#include <string.h>
int main()
{
    FILE*f;
    char*s="Hey,Buddy!";
    int i;
    f=fopen("myFile.txt","w");
    
    for(i=0;i<strlen(s);i++)
    {
        fputc(s[i],f);       //输出到文件
        fputc(s[i],stdout);  //输出到标准输出
    }
    fclose(f);
    return 0;
}

 

10、fwrite(buf,size,n,fp

 

#include <stdio.h>
int main ()
{
    FILE *fp;
    char buffer[] = { 'x' , 'y' , 'z' };
    fp = fopen ( "myfile.bin" , "wb" );
    fwrite (buffer , sizeof(char), sizeof(buffer) , fp );
    fclose (fp);
    return 0;
}


11、fread(buf,size,n,fp

#include<stdio.h>
#include<string.h>
int main(void)
{
    FILE *stream;
    char msg[]="this is a test";
    char buf[20];
    if((stream=fopen("myfile.txt","w+"))==NULL)
    {
        fprintf(stderr,"Can not open output file.\n");
        return 0;
    }
    fwrite(msg, 1, strlen(msg)+1, stream);   //把msg的东西写入文件
    fseek(stream,0L,SEEK_SET);              //因为上一部,要重新把文件指针放在文件的开头
    fread(buf,strlen(msg)+1,1,stream);     //再从文件读取放入msg
    printf("%s\n",buf);          
    fclose(stream);
    return 0;
}


12、fflush(fp

 


fopen  fseek   fputs  fprintf   fscanf 一起使用的例子

#include <cstdio>
int main()
{
    FILE* fp;
    int i = 617;
    char* s = "that is a good new";  
    fp = fopen("2.txt", "w+");      //读写打开,会覆盖

    /*这里用的fputs向文件输入字符串,没有用fprintf*/
    fputs("total", fp);       //向文件中输入字符串, 不会自动加\0,  fp在后面
    fputs(":", fp);
    
    /*这里用了fprintf但是却一次输入一个*/
    fprintf(fp, "%d\n", i);    //要自己加一个\n
    fprintf(fp, "%s", s);     //字符串自己做变量名,也作地址用
    
    
    char a[20],b[20],c[20],d[20],e[20];
    fseek(fp,9L,0);  //偏移9个字节 
    fscanf(fp,"%s %s %s %s %s",a,b,c,d,e);
    printf("%s %s %s %s %s",a,b,c,d,e);
    fclose(fp);
    return 0;
}

 

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值