C语言——文件操作详解

简介: C语言——文件操作详解

文件打开与关闭


C文件操作用库函数实现,包含在stdio.h中。


文件使用方式:


打开文件→文件读/写→关闭文件


系统自动打开和关闭三个标准文件:


标准输入------键盘 stdin


标准输出------显示器 stdout


标准出错输出-----显示器 stderr






文件读写操作


当我们把文件打开之后,就可以对它进行读与写的操作。


读/写文件中的一个字符



文件I/O与终端I/O的关系



案例:


例如:从键盘输入字符,逐个写入文件,直到输入一个“#”为止。


#include <stdio.h>
int main(void)
{ 
  FILE *fp = NULL;
  char ch;
  fopen_s(&fp, "D:\\text.txt", "w");
  if (fp == NULL)
  {
    exit(0);
  }
  else  
  { 
    ch = getchar();
    while (ch != '#')
    { fputc(ch, fp);  
      //字符被写入filename表示的文件中
      putchar(ch);   
      //字符被输出到显示器
      ch = getchar();
    }
    putchar(10);     // 向屏幕输出一个换行符
    fclose(fp);
  }  
  return 0;
}


例如:将一个磁盘文件中的信息复制到另一个磁盘文件中。


#include <stdio.h>
#include <stdlib.h>
int main(void)
{
  FILE *in, *out;
  char ch;
  if ((fopen_s(&in,"D:\\dd.txt", "r")) != 0)
  {
    printf("Cannot open infile.\n"); 
    exit(0);
  }
  if ((fopen_s(&out,"D:\\ee.txt", "w")) != 0)
  {
    printf("Cannot open outfile.\n"); 
    exit(0);
  }
  while (!feof(in))
    fputc(fgetc(in), out);
  fclose(in);   
  fclose(out);
  return 0;
}


读/写文件中的字符串



数据块输入输出函数:fread与fwrite


一般调用形式:


fread(buffer,size,count,fp );


fwrite(buffer,size,count,fp );


参数说明:


buffer: 要读入的数据块的存放首地址或要输出的数据块的起始地址。


size: 每个要读/写的数据块的大小(字节数)


count: 要读/写的数据块的个数


fp: 要读/写的文件指针


返回值:


成功,返count的值;出错或文件尾,0值。


fread与fwrite 一般用于二进制文件的输入/输出


若文件以二进制形式打开,用fread或fwrite 可读写任何类型的数据。


案例:


例如:输入4个学生数据,转存到磁盘文件,在屏幕上显示文件内容。

#include <stdio.h>
#define SIZE 4
struct student_type
{
  char name[10];
  int num;
  int age;
  char addr[15];
}stud[SIZE];
void display();
void save();
int main()
{
  int i;
  for (i = 0; i < SIZE; i++)
  {
    scanf_s("%s", &stud[i].name, 10);
    scanf_s("%d", &stud[i].num);
    scanf_s("%d", &stud[i].age);
    scanf_s("%s", &stud[i].addr, 15);
  }
  save();
  display();
  return 0;
}
void save()
{
        FILE *fp;
        int  i;
        if ((fopen_s(&fp,"D:\\stu_list", "wb")) != 0)
        {
  printf("cannot open file\n");
  return;
       }
       for (i = 0; i<SIZE; i++)
  if (fwrite(&stud[i], sizeof(struct student_type), 1, fp) != 1)
          printf("File write error\n");
  fclose(fp);
}
void display()
{
        FILE *fp;
        int  i;
        if ((fopen_s(&fp,"D:\\stu_list", "rb")) != 0)
        {
  printf("Cannot open file\n");   return;
        }
        for (i = 0; i<SIZE; i++)
        {
  fread(&stud[i], sizeof(struct student_type), 1, fp);
  printf("%-10s %4d %4d %-15s\n", stud[i].name,stud[i].num, stud[i].age, stud[i].addr);
        }
  fclose(fp);
}


格式化读写文件操作


fscanf_s() 和 fprintf() 的读写对象不是键盘和显示器,而是磁盘数据文件。


文件操作中的格式化输入输出函数 fscanf_s和 fprintf 一定意义上就是 scanf 和 printf 的文本版本。


文件格式化输入函数 fscanf_s的函数原型为:


int fscanf_s(文件指针,格式控制串,输入地址表列);


所在头文件:<stdio.h>


**函数功能:**从一个文件流中执行格式化输入,当遇到空格或者换行时结束。

注意:


该函数遇到空格时也结束,这是其与 fgets 的区别,fgets 遇到空格不结束。


返回值:


输入成功时,返回输入的数据个数;


输入失败,或已读取到文件结尾处,返回 EOF(-1)。


故一般可根据该函数的返回值是否为 EOF 来判断是否已读到文件结尾处。


案例:


格式化读写文件操作(一)

#include<stdio.h>
int main()
{ 
  int ixnumber, iynumber;
  FILE *fp=NULL;
  fopen_s(&fp, "D:\\datafile.txt", "r");     
  if (fp == NULL)
  {
    printf("Failed to open the File!\n");
    exit(0);
  }
  fscanf_s(fp, "%d,%d", &ixnumber, &iynumber);
   //从fp所指文件中读取一个整数保存到变量ixnumber, iynumber
  printf("\n%d,%d\n\n", ixnumber, iynumber);
  fclose(fp);
  return 0;
}


结果为:



文件格式化输出函数 fprintf 的函数原型为:


int fprintf (文件指针,格式控制串,输出表列);


所在头文件:<stdio.h>


函数功能:把输出列表中的数据按照指定的格式输出到文件中。


返回值:输出成功,返回输出的字符数;输出失败,返回一负数。


【实战案例】格式化读写文件操作(二)


#include<stdio.h>
int main()
{ 
  int ixnumber, iynumber;
  FILE *fp=NULL;
  fopen_s(&fp, "D:\\datafile.txt", "w");     
  if (fp == NULL) 
  {
    printf("Failed to open the File!\n");
    exit(0);
  } 
  char name[10] = "张三";
  char no[15] = "20190410001";
  int age = 17;
  fprintf(fp, "%s\t%s\t%d\n", name, no, age);
  fclose(fp);
  return 0;
}


文件定位函数



C语言规定的起始位置有三种,分别为文件开头、当前位置和文件末尾,每个位置都用对应的常量来表示:



例如:把位置指针移动到离文件开头100个字节处:


fseek(fp, 100, 0);


值得说明的是,fseek() 一般用于二进制文件,在文本文件中由于要进行转换,计算的位置有时会出错。



作业使用案例(自己可以全部完成一遍):


使用fgetc()、fputc()、fgets()、fputs()、fread()、fwrite()、fscanf_s()、fprintf()、rewind()、fseek()实现文件输入输出操作。


代码如下:

#include<stdio.h>
#include<stdint.h>
#include<stdlib.h>
#include<Windows.h>
int main()
{
  FILE *fp = NULL;
  fopen_s(&fp, "text.txt", "r");
  if (fp == NULL)
  {
    printf("文件打开失败\n");
  }
  else
  {
    printf("文件打开成功\n");
  }
  char ch;
  ch = fgetc(fp);   // 读取字符
  while (ch != EOF)
  {
    putchar(ch);    // 打印读取的字符
    ch = fgetc(fp);   // 再一次读  重新赋值ch
  }
  printf("\n");
  fclose(fp);
  fopen_s(&fp, "text.txt", "a+");
  char ch1;
  ch1 = getchar();
  while (ch1 != '#')
  {
    fputc(ch1, fp);
    ch1 = getchar();
  }
  fclose(fp);
  FILE *in, *out;
  char ch2;
  if ((fopen_s(&in, "dd.txt", "r")) != 0)
  {
    printf("文件打开失败!\n");
  }
  if ((fopen_s(&out, "ee.txt", "w")) != 0)
  {
    printf("文件打开失败!\n");
  }
  while (!feof(in))
  {
    fputc(fgetc(in), out);
  }
  fclose(in);
  fclose(out);
  FILE*fp2;
  fopen_s(&fp2, "bb.txt", "a+");
  char str[] = "chuan";
  fputs(str, fp2);
  fclose(fp2);
  FILE *fp1;
  int a, b;
  fopen_s(&fp1, "file.txt", "a+");
  if (fp1 == NULL)
  {
    printf("文件打开失败\n");
  }
  fscanf_s(fp1,"%d,%d", &a, &b);
  printf("%d,%d\n", a, b);
  fprintf(fp1, "%d%d\n", a, b);
  fclose(fp1);
  FILE*fq3;
  fopen_s(&fq3,"bb.txt", "wb+");
  int se = 1;
  if (fread(&se, sizeof(4), 1, fq3) != 0)
  {
    printf("文件打开失败");
  }
  if (fwrite(&se, sizeof(4), 1, fq3) != 0)
  {
    printf("文件写入失败");
  }
  system("pause");
  return 0;
}


结果如下:


相关文章
|
6月前
|
存储 程序员 C语言
c语言文件操作
本文介绍了C语言中文件操作的核心概念,包括文件缓冲区、数据与程序文件的区别、流的概念及标准输入输出流。重点讲解了文件的打开与关闭、读写操作(如fgetc、fputs、fscanf、fwrite等),以及随机读写函数fseek、ftell和rewind的使用方法。同时说明了文本文件与二进制文件的读取结束判定方式,并通过代码示例展示了实际应用。
|
10月前
|
存储 编译器 程序员
c语言的文件操作与文件缓冲区
如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。磁盘(硬盘)上的文件是文件。但是在程序设计中,我们⼀般谈的⽂件有两种:程序文件、数据文件(从文件功能的角度来分类 的)。就比如说我们电脑中以.txt为后缀的就是文件的一种,他就是数据文件。.exe为后缀的就为程序文件。函数名功能适用范围fgetc字符输入函数所有输入流fputc字符输出函数所有输出流fgets。
377 0
|
人工智能 C语言
|
存储 小程序 C语言
【C语言程序设计——文件】文件操作(头歌实践教学平台习题)【合集】
本文介绍了C语言中的文件操作,分为两个关卡。第1关任务是将键盘输入的字符(以#结束)存入`file1.txt`并显示输出;第2关任务是从键盘输入若干行文本(每行不超过80个字符,用-1作为结束标志),写入`file2.txt`后再读取并显示。文中详细讲解了文件的打开、读取(使用`fgetc()`和`fgets()`)、写入(使用`fputc()`和`fputs()`)及关闭操作,并提供了示例代码和测试说明。
457 5
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
699 9
|
存储 数据管理 C语言
C 语言中的文件操作:数据持久化的关键桥梁
C语言中的文件操作是实现数据持久化的重要手段,通过 fopen、fclose、fread、fwrite 等函数,可以实现对文件的创建、读写和关闭,构建程序与外部数据存储之间的桥梁。
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
915 3
|
存储 C语言
【c语言】玩转文件操作
本文介绍了C语言中文件操作的基础知识,包括文件的打开和关闭、文件的顺序读写、文件的随机读写以及文件读取结束的判定。详细讲解了`fopen`、`fclose`、`fseek`、`ftell`、`rewind`等函数的使用方法,并通过示例代码展示了如何进行文件的读写操作。最后,还介绍了如何判断文件读取结束的原因,帮助读者更好地理解和应用文件操作技术。
379 2
|
存储 编译器 C语言
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
|
存储 编译器 C语言
C语言:文件缓冲区刷新方式有几种
C语言中文件缓冲区的刷新方式主要包括三种:自动刷新(如遇到换行符或缓冲区满)、显式调用 fflush() 函数强制刷新、以及关闭文件时自动刷新。这些方法确保数据及时写入文件。