一、字符的读取与写入((fputc、fgetc)
int fputc (int c, File *fp);

功能

  • 将字符c写入到fp流中

返回值

  • 写入成功:返回写入文件的字符的ASCII码值
  • 写入失败:返回EOF(-1)

当正确写入一个字符的数据后,文件内部写指针会自动后移一个字节的位置

int fgetc(FILE *stream);

功能

  • 从参数流中读取一个字符

返回值

  • 读取成功:返回所读取的一个字符。如果读到文件末尾或者读取出错时
  • 读取出错/读到文件末尾:返回EOF

读取一个字节后,光标位置后移一个字节

//将字符串arr写入到标准输出中去
#include <stdio.h> 
#include<string.h>
int main()  
{      
    char *arr="HelloWorld";
    int i=0;
    while(i<strlen(arr)){
        fputc(arr[i],stdout);
        ++i;
    }
    fputc('\n',stdout);	
    return 0; 
}
//把f1所指的文件内容拷贝到f2所指的文件中
#include <stdio.h> 
int main()  
{      
    FILE *f1,*f2;
    if(f1=fopen("Demo.txt","r"))
    {
        f2=fopen("Demo2.txt","w+");
        char s;
        while((s=fgetc(f1))!=EOF){
            fputc(s,f2);
        }
        fclose(f2);
    }
    fclose(f1);
    return 0; 
}
二、字符串的写入和读取(fputs、fgets)
int fputs(const char *str, FILE *stream);

功能

  • 将字符串str写入stream流中

返回值

  • 写入成功:返回一个非负值
  • 写入失败:返回 EOF(-1)

成功写入一个字符串后,文件的位置指针会自动后移

char *fgets(char *buf, int bufsize, FILE *stream);

功能

  • 从stream流中读取bufsize-1字节的数据存放到buf中去,第bufsize个字节赋值为'\0'

返回值

  • 读取成功:返回第一个参数buf字符串的首地址
  • 读取失败:返回NULL,并设置error的值,buf的值可能被改变

成功写入一个字符串后,文件的位置指针会自动后移

遇到换行符就结束读取

//把f1所指的文件内容拷贝到f2所指的文件中
#include <stdio.h> 
int main()  
{      
    FILE *f1,*f2;
    if(f1=fopen("Demo.txt","r"))
    {
        f2=fopen("Demo2.txt","w+");
        char s[2];
        while((fgets(s,2,f1))!=NULL)
        {
            fputs(s,f2);
        }
        fclose(f2);
    }
    fclose(f1);
    return 0; 
}
三、格式化字符串的读取和写入(fscanf、fprintf)
int fscanf(FILE* stream,const char* format,[argument...]);

功能

  • 从stream流中读取后面的format格式的字符串,然后存放到后面的argument中

返回值

  • 读取成功:返回写入的参数的个数
  • 读取失败:失败返回EOF(-1)

注意

  • fscanf遇到空格和换行时结束
int fprintf (FILE* stream, const char* format, [argument]);

功能

  • 将格式化的字符串format写入到stream流中

返回值

  • 读取成功:返回值是写入的字符数
  • 读取失败:返回一个负数

注意

  • fprintf直到出现字符串出现结束('\0')才停止写入
//从标准输入读取数据,然后写入到标准输出中
#include <stdio.h> 
int main()  
{      
    int num;
    if(fscanf(stdin,"%d",&num))
    {
        fprintf(stdout,"%d",num);
    }
    return 0; 
}
//将一些变量写入到Demo.txt中,然后再读取出来
#include<stdio.h>
#include<string.h>
int main()  
{      
    FILE* f;
    f=fopen("Demo.txt","w+");
    char name[11]="HelloWorld";
    int age=17;
    double length=18.5;
    fprintf(f,"%s %d %lf\n",name,age,length);//写入到文件中
    fclose(f);//一定要记得关闭文件
    strcpy(name,"");
    age=0;
    length=0;
    f=fopen("Demo.txt","r");
    fscanf(f,"%s %d %lf\n",&name,&age,&length);//再读取
    printf("%s %d %lf\n",name,age,length);//打印出来
    fclose(f);
    return 0; 
}
四、fread()、fwrite()
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);

功能

  • 从stream流中读取count次数据,每次读取size个字节大小。然后写入到buffer中

返回值

  • 读取成功:返回实际读取stream流的次数,而不是字节数
  • 读取失败/达到文件尾:返回0
  • 若stream或buffer为空指针,或在unicode模式中写入的字节数为奇数,此函数设置errno为EINVAL以及返回0
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);

功能

  • 从buffer中读取count次,每次读取size个字节,然后写入到stream流中

返回值

  • 读取成功:返回实际写入stream流的次数,而不是字节数
//将一个结构体信息写入到文件中,然后再文件中读出来
#include<stdio.h>
#include<string.h>
typedef struct student
{
    int age;
    char name[20];
}stu;
int main()  
{      
    stu Man={17,"xiaoming"};
    stu Man2;
    FILE *pf;
    if(pf=fopen("Demo.txt","w+"))
    {
        fwrite(&Man,sizeof(stu),1,pf);
    }
    fclose(pf);
    if(pf=fopen("Demo.txt","r"))
    {
        fread(&Man2,sizeof(stu),1,pf);
        printf("Age:%d,Name:%s\n",Man2.age,Man2.name);
        fclose(pf);
    }
    return 0; 
}