用c语言处理文件只需要用到几个简单的函数:

  1.文件的打开和关闭

  fopen()函数用来打开一个文件,该函数原型在头文件stdio.h中,调用的一般形式为

  

 /* FILE 是c语言内置的一个结构体类型,可以直接使用 */
/* 这里定义了一个指向文件l类型的指针 */
FILE *fp;
fp = fopen(文件名,使用文件方式); /* 使用文件方式是指要对文件进行哪些操作 */

  使用文件方式:

  r(只读)    打开一个文本文件,只允许读取数据

  w(只写)     打开或建立一个文本文件,只允许写入数据

  a(追加)     打开一个文本文件,并在文件末尾写入数据

  rb(只读)    打开一个二进制文件,只允许读取数据

  wb(只写)     打开或建立一个二进制文件,只允许写数据

  wa(追加)     打开一个二进制文件,并在文件末尾写数据

  r+(读写)    打开一个文本文件,运行读和写

  w+(读写)           打开或建立一个文本文件,允许读和写

  a+(读写)      打开一个文本文件,允许读或者在文件末尾追加数据

  rb+(读写)     打开一个二进制文件,允许读和写

  wb+(读写)    打开或建立一个二进制文件,允许读和写

  ab+(读写)    打开一个二进制文件,允许读,或者在文件末尾追加数据

  如果使用fopen()函数打开文件失败,通常有下面几种原因:

  1. 指定的盘符或路径不存在

  2. 文件名中含有无效字符

  3. 以r模式打开一个不存在的文件

  

  每次打开文件并操作之后一定要记得关闭文件,这样做的目的是防止因为没有关闭文件而造成的数据流失!

  关闭文件用函数    fclose(fp);

  当文件正常关闭,该函数返回,否则返回 EOF

  2. 文件的读写

  fputc(ch,fp);        => 该函数把字符ch写入到fp所指向的文件,写入成功则返回被写入的字符,失败则返回EOF

  ch = fgetc(fp);     => 该函数从fp所指向的文件中读取一个字符赋值给ch,该文件必须是以读或读写的方式打开的

  fputs(str,fp);        => 该函数向fp指向的文件中写入一个字符串,其中字符串可以是字符串常量,也可以是字符数组名、指针或变量

  fgets(*str,n,fp);      => 该函数从fp指向的文件中读取一个字符串到str中,n表示读取到字符的个数

  fprintf(fp,"%d",i);      => 该函数将i的值以%d格式写入到fp指向的文件中

  fscanf(fp,"%d",&i);   => 该函数从fp所指的文件中读取一个字符并以%d的格式赋值给i

  fread(str,size,count,fp); => 该函数从fp所指的文件中读入count次,每次读size字节,读入的信息存放在str地址中

  fwrite(str,size,count,fp); => 该函数将从str地址开始的数据分 count 次写入 fp 指向的文件中,每次写入size字节

  
  3. 文件的定位

  我们对文件的操作不一定每次都要从头开始,所以我们要有办法来移动光标在文件中的位置,在这里介绍几个可以完成定位功能的函数

  fseek(fp,nL,i);

  该函数在fp所指向的文件内部定位光标,其中 i 的值为 1、2、3。

  i = 0   => 定位到文件首

  i = 1   => 定位到当前位置

  i = 0   => 定位到文件尾

  n表示从i所指示位置的位移量,如 fseek(fp,2L,0); 表示从文件头开始向前移动两个字节。

  需要注意的是这个函数一般用于二进制文件,在文本文件中由于要进行转换,所以计算的位置往往会出现错误。

  rewind(fp);

  该函数在fp所指向的文件内部将光标定位到文件开头。

  该函数无返回值。

  rtell(fp);

  该函数得到流式文件中的当前位置,用相对于文件开头的位移量来表示。

  当ftell()函数的返回值为 -1L 时,表示出错

  测试代码

  

 #include<stdio.h>
#include<string.h> void main()
{
// 创建文件指针
FILE *fp;
char ch = 'a';
char *str = "hhhhhhhhhhhhh";
char str1[]; //创建或打开文件
fp = fopen("test.txt","w+"); // 读入一个字符到文件**********************
ch = fputc(ch,fp); // 关闭文件
fclose(fp); fp = fopen("test.txt","r");
// 从文件夹中读取一个字符 ***********************
ch = fgetc(fp);
printf("从文件夹中读取字符:%c\n",ch);
fclose(fp); // 写入字符串 ******************************
fp = fopen("test.txt","a");
fputs(str,fp);
printf("写入字符串\n");
fclose(fp); // 读取字符串 *****************************
fp = fopen("test.txt","r");
fgets(str1,,fp);
printf("从文件中读取字符串:%s\n",str);
fclose(fp); // 利用 fprintf()函数写入数据到文件*****************************
fp = fopen("test.txt","a");
fprintf(fp,"%s","\nhahahahaha");
fclose(fp); // 利用 fscanf()函数读取数据到程序***********************************
// 一次读取一个字符串,遇到空格结束
fp = fopen("test.txt","r");
fscanf(fp,"%s",str1);
printf("从文件夹中读取字符串:%s\n",str1);
fscanf(fp,"%s",str1);
printf("从文件夹中读取字符串:%s\n",str1);
fclose(fp); // 利用 fread() 和 fwrite() 函数成段读取和传入数据*********************************
fp = fopen("test.txt","r");
fread(str1,,,fp);
printf("从文件夹中读取两次字符串,每次读取10个:%s\n",str1);
fclose(fp); fp = fopen("test.txt","a");
fwrite("",,,fp);
printf("向文件夹中输入两次字符串,每次输入10个字符!\n");
fclose(fp); // 文件的定位**********************************************
fp = fopen("test.txt","r+");
// 从当前位置向前移两格
fseek(fp,2L,);
fscanf(fp,"%s",str1);
printf("当前位置字符串为:%s\n",str1); // 从文件尾向后退十格
fseek(fp,-10L,);
fscanf(fp,"%s",str1);
printf("当前位置字符串为:%s\n",str1); // 返回文件开头
rewind(fp);
fscanf(fp,"%s",str1);
printf("(开头)当前位置字符串为:%s\n",str1); // 返回当前光标的位置,用相对于开头的位移量来表示
// 当返回值是-1L时表示出错
fseek(fp,20L,);
printf("当前光标在文件中的位置是:%d\n",ftell(fp));
fscanf(fp,"%s",str1);
printf("当前位置字符串为:%s\n",str1); fclose(fp);
}

用c语言处理文件的更多相关文章

  1. BMP头文件格式以及C语言读取头文件【转】

    BMP头文件格式以及C语言读取头文件[转] (2011-12-24 22:59:17) 转载▼ 标签: 杂谈 分类: 各个领域的知识 BMP图像文件由三部分组成:位图文件头数据结构,它包含BMP图像文 ...

  2. c语言头文件中定义全局变量的问题

    c语言头文件中定义全局变量的问题 (转http://www.cnblogs.com/Sorean/) 先说一下,全局变量只能定义在 函数里面,任意函数,其他函数在使用的时候用extern声明.千万不要 ...

  3. C 语言 .h文件的作用

    C语言头文件的作用 最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的 ...

  4. 嵌入式C语言头文件的建立与使用

    如何正确编写 C 语言头文件和与之相关联的 c 源程序文件,这首先就要了解它们的各自功能. 要理解 C 文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程. 一般说来编译器会做以下几 ...

  5. C语言基础文件读写操作

    整理了一份C语言的文件读写件操作代码,测试时打开相应的注释即可. #include <stdio.h> #include <stdlib.h> #include <uni ...

  6. 51单片机C语言学习笔记6:51单片机C语言头文件及其使用

    很多初学单片机者往往对C51的头文件感到很神秘,而为什么要那样写,甚至有的初学者喜欢问,P1口的P为什么要大写,不大写行不行呢?其实这个是在头文件中用sfr定义的,现在定义好了的是这样的 sfr P1 ...

  7. C语言头文件

    最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的思考过.概念上还是比 ...

  8. C语言判断文件夹或者文件是否存在的方法【转】

     C语言判断文件夹或者文件是否存在的方法   方法一:access函数判断文件夹或者文件是否存在 函数原型: int access(const char *filename, int mode); 所 ...

  9. C语言程序设计--文件操作

    前言 这里尝试与Python对别的方法来学习C语言的文件操作,毕竟我是Pythoner. 文件打开与关闭 Python #因为是和C语言比对,所以不使用with filename = "/e ...

  10. C++标准库头文件名字和C语言头文件名字的区别

    1.C++版本的C标准库头文件,一般是cname,而C语言头文件一般是name.h 2.命名为cname的头文件中定义的名字都是从std中来的,而如果是name.h则不是这样的. 3.与是用name. ...

随机推荐

  1. C#LeetCode刷题之#771-宝石与石头(Jewels and Stones)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3812 访问. 给定字符串J 代表石头中宝石的类型,和字符串 S代 ...

  2. c++ sort函数三个参数解释

    第一个参数 一般为 排序的起始点 vector.begin()(起点) 或者其他位置 第二个参数 一般为 排序的终止点 vector.end() (终点) 或者其他位置 第三个参数是排序函数 对于一些 ...

  3. Ubuntu 18.04 安装、配置和美化

    本文章修改自inkss的博文 为什么要修改原文? 本来我是想自己写这么一篇的,但是没想到在百度一搜,居然一篇好文.我之前没看到,真是可惜. 这篇文章主要是帮助我记录一些东西,如题. 原文虽然不错,但是 ...

  4. pycharm激活,此方法为永久激活。

    1.下载JetbrainsCrack-3.1-release-enc.jar文件 链接: https://pan.baidu.com/s/1eN4paXtLVLeUN1nLP335rA 提取码: yg ...

  5. .net Core 下使用 X509Certificate2 给报文加签

    起因 项目开发中途出现需求需要对接其他公司接口,使用证书进行认证传输,之前在.Net下搞过但是都是对方给我证书 这次需要我生成公钥/私钥,公钥给他这样操作. 生成私钥/公钥(这里是RSA算法,长度规定 ...

  6. yb课堂之压力测试工具Jmeter5.X 实战《二十二》

    目前常用的测试工具对比 LoadRunner 性能稳定,压测结果及细粒度大,可以自定义脚本进行压力,但是太过于重大,功能比较繁多 Apache AB(单接口压测最方便) 模拟多线程并发请求,ab命令对 ...

  7. 为什么 java.util.Stack不被官方所推荐使用!

    Java 为什么不推荐使用 Stack 呢? 因为 Stack 是 JDK 1.0 的产物.它继承自 Vector,Vector 都不被推荐使用了,你说 Stack 还会被推荐吗? 当初 JDK1.0 ...

  8. Qt 实现 异形 窗体&按钮

    //关键部分代码如下//设置异形窗体 //setWindowOpacity(0.5);//设置窗体透明度 0完全透明,1完全不透明 this->setWindowFlag(Qt::Framele ...

  9. Spring Security自定义认证页面(动态网页解决方案+静态网页解决方案)--练气中期圆满

    写在前面 上一回我们简单分析了spring security拦截器链的加载流程,我们还有一些简单的问题没有解决.如何自定义登录页面?如何通过数据库获取用户权限信息? 今天主要解决如何配置自定义认证页面 ...

  10. Java多线程_Semaphore信号量

    概念: Semaphore是信号量,又称为信号灯,它可以控制某个共享资源可被同时访问的次数,即可以维护当前访问某一共享资源的线程个数,并提供了同步机制.当Semaphore的个数变成1时,即代表只允许 ...