文件处理函数总结

1、fputc、fgetc

int fputc(int ch, FILE *stream);

功能:将ch转换为unsigned char后写入stream指定的文件中
参数:
ch:需要写入文件的字符
stream:文件指针
返回值:
成功:成功写入文件字符
失败:返回-1

#include 
#include 
int main(int argc, char const *argv[]) {

  //1、打开文件
  FILE *fp = NULL;
  fp = fopen("04.txt", "w");
  if(fp == NULL)
  {
    perror("fopen:");
  }
  //2、用fputc()写文件,一次只能写一个字符
  fputc('a', fp);
  fputc('b', fp);
  fputc('c', fp);
  fputc('d', fp);
  fputc('\n', fp);

  char ch = 'a';
  while(ch <= 'z')
  {
    fputc(ch, fp);
    ch++;
  }
  fputc('\n', fp);

  char buf[] = "PersisTHd";
  int n = sizeof(buf);
  int i = 0;
  for(i=0; i

int fgetc(FILE *stream);

功能:从stream指定的文件中读取一个字符
参数:
stream:文件指针
返回值:
成功:返回读取到的字符
失败:-1
注意:如果是文本文件可以通过-1(EOF)判断文件是否结尾;如果是二进制文件,不能以-1判断文件是否结尾,此时需要feof()函数判断文件是否结尾
feof(fp); //如果到文件结尾,返回真
注意:1、如果第一次没有对文件进行读操作,直接调用此函数,永远返回真
2、此函数必须先读,再调用feof()才有意义

#include 
#include 
void write_file()
{
  FILE *fp = fopen("05.txt", "w");
  if(fp == NULL)
  {
    perror("fopen:");
  }

  char *p = "PersisTHd";
  int n = strlen(p);
  int i = 0;
  for(i=0;i

2、fputs、fgets

int fputs(const char *s, FILE *stream);

s 代表要输出的字符串的首地址,可以是字符数组名或字符指针变量名
返回值:写入成功返回非负数,失败返回 EOF

#include 
#include 

int main(int argc, char const *argv[]) {
  /* code */
  //1、打开文件
  FILE *fp = fopen("09.txt", "w");
  if(fp == NULL)
  {
    perror("fopen: ");
  }

  //2、写入文件
  //fputs()按行读取,默认遇到换行符表示此处读取结束,换行符也放在buf中
  char *p[] = {"Hello\nabc", "PersisTHd\n", "You are the best!\n"};
  int n = sizeof(p) / sizeof(p[0]);
  int i = 0;
  for(i=0;i

char *fgets ( char *str, int n, FILE *fp );

功能:来从指定的文件中读取一个字符串,并保存到字符数组中
str 为字符数组,n 为要读取的字符数目,一次最大读取数为,fp 为文件指针
返回值:读取成功时返回字符数组首地址,也即 str;读取失败时返回 NULL;如果开始读取时文件内部指针已经指向了文件末尾,那么将读取不到任何字符,也返回 NULL。

include 
#include 

int main(int argc, char const *argv[]) {

  //1、打开文件
  FILE *fp  = fopen("09.txt", "r");
  if(fp == NULL)
  {
    perror("fopen: ");
  }
  //2、读取文件
  char buf[100];
  printf("sizeof(buf) = %ld\n", sizeof(buf));
  while(1)
  {
    //从fp所关联的文件读取内容,存放到buf中,一次最大读取为sizeof(buf)-1
    //遇到换行符、文件结尾、出错等情况,结束本次读取
    //读取出错时,buf中保留上次读取的内容
    fgets(buf, sizeof(buf), fp);
    if(feof(fp))
    {
      break;
    }
    printf("%s", buf);

  }

  //3、关闭文件
  fclose(fp);
  fp = NULL;
  return 0;
}

3、fprintf、fscanf

int fprintf(FILE * stream, const char * format, ...);

fprintf()会根据参数format 字符串来转换并格式化数据, 然后将结果输出到参数stream 指定的文件中, 直到出现字符串结束('\0')为止;
返回值:成功则返回写入的字符的个数,失败则返回负数

#include 
#include 
#include 

int main(int argc, char const *argv[]) {

  FILE *fp = fopen("15.txt", "w");
  if(fp == NULL)
  {
    perror("fopen: ");
  }

  srand( (unsigned int)time(NULL) );

  int i = 0;
  int n = 10;
  int num = 0;

  for(i=0; i

int fscanf ( FILE *fp, char * format, ... );

用于格式化从文件中读取数据,fscanf() 返回参数列表中被成功赋值的参数个数

#include 
#include 
#include 

int main(int argc, char const *argv[]) {
  /* code */
  FILE *fp  = fopen("15.txt", "r");
  if(fp == NULL)
  {
    perror("fopen: ");
  }
  int num;

  while(1)
  {
    fscanf(fp, "%d\n", &num);   //如果读取不成功则会保存上一次的状态
    printf("num = %d\n", num);  //相较于fgets不会多打印一行的原因是它会判断下一个值是否满足指定的格式要求,不满足就会提前结束
    if(feof(fp))
    {
      break;
    }
  }
  fclose(fp);
  fp = NULL;
  
  return 0;
}

4、fwrite、fread(二进制文件,前三个函数是操作文本文件)

size_t fwrite(const void *ptr, size_t size, size_t, nmemb, FILE *stream);

功能:以数据块的方式给文件写内容
参数:
ptr:准备写入文件数据的地址
size:size_t为unsigned int类型,此参数指定写入文件内容的块数据大小
nmemb:写入文件的块数,写入文件总数据大小为:size*nmemb
stream:已经打开的文件指针
返回值:
成功:实际成功写入文件数据的块数目,此值和nmemb相等
失败:0
注意:size和nmemb的值没有限制,只要二者的乘积等于文件总数大小即可

#include 
#include 
#include 
typedef struct Student
{
  int age;
  char name[50];
  int score;
}student;

int main(int argc, char const *argv[]) {
  /* code */
  FILE *fp = fopen("18.txt", "w");
  if(fp == NULL)
  {
    perror("fopen: ");
  }

  student s1[4] = {
    18, "Thd", 99,
    19, "zjj", 100,
    20, "hua", 98,
    21, "dong", 97
  };

  int ret = fwrite(s1, 1, sizeof(s1), fp);   //可以写二进制文件

  fclose(fp);
  fp = NULL;
  return 0;
}

size_t fread(void *buf, size_t size, size_t count, FILE *fp);

#include 
#include 
#include 

typedef struct Student
{
  int age;
  char name[50];
  int score;
}student;

int main(int argc, char const *argv[]) {

  FILE *fp = fopen("18.txt", "r");
  if(fp == NULL)
  {
    perror("fopen:");

  }

  student s[10];

  /*
  s,放置读取文件内容的变量地址
  sizeof(student),读取文件内容的块大小
  4,读取文件内容的块数目
  返回值:成功时返回读取文件内容的块数目,失败时返回0

  关于返回值的说明:
  1、如果文件内容大小 > 用户指定的读取大小,返回值为用户指定的块数目
  int ret = fread(s, sizeof(student), 2, fp);
  2、如果文件内容大小 < 用户指定的读取大小,返回值为实际读取的块数目
  int ret = fread(s, sizeof(student), 10, fp);   返回值为4
  下面这种情况,用户指定要10*sizeof(s)的大小,文件只有0.4个sizeof(s),所以返回值为0
  int ret = fread(s, sizeof(s), 10, fp);
  如果把块大小指定为1,那么返回值就是读取文件的总大小(方便处理并且返回值不可能是0)
  int ret = fread(s, 1, 10, fp);
  */
  fread(s, sizeof(student), 4, fp);

  fclose(fp);
  fp == NULL;

  int i = 0;
  for(i=0;i<4;i++)
  {
    printf("%d, %s, %d\n", s[i].age, s[i].name, s[i].score);
  }

  return 0;
}


你可能感兴趣的:(文件处理函数总结)