目录

文本文件相关介绍

1.打开文件

2.文件的读取

(1) fgetc 函数

(2)fgets 函数

(3)fscanf 函数

(4)fread 函数

3.关闭文件

fclose(FILE *stream );

4.文件的写入

(1)fpuc 函数

(2)fputs 函数

(3)fprintf 函数

(4)fwrite 函数

5.文本文件的指针定位

(1)rewind 函数

(2)fseek 函数


        有时候我们想通过编程语言来操作外部文件,对外部文件进行读取和修改、或者创建文件以此达到想要的目的。对此,我通过这篇文章来介绍如何通过C语言来操作文本文件。

文本文件相关介绍

文本文件是一种计算机文件,它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。特别的是,文本文件是指以ASCII码方式(也称文本方式)存储的文件,更确切地说,英文、数字等字符存储的是ASCII码,而汉字存储的是机内码。文本文件中除了存储文件有效字符信息(包括能用ASCII码字符表示的回车、换行等信息)外,不能存储其他任何信息。

文本文件常用格式:

(1).txt  纯文字文档,不携带字体的颜色、类型、以及相关修饰格式。

(2).doc  是Microsoft Word创建的格式化文件,一般用于图文排版。

(3).pdf 具有良好的加密性,一般多用于企业办公。

(4).doc与.docx  .doc文件是旧版World文档旧版文件格式,.docx是新版格式。

(5).ASCLL 指含有用标准ASCII字符集编码的字符的数据和文本文件。

平时我们可以打开记事本或者文档来直接写入内容,然后保存起来,这就成功创建了一个文本文件,那么怎么通过C语言来去创建并且写入内容呢?下面是相关文本函数的简介。

标准头文件#include<stdio.h>

这里我的文件相对路径是 text.txt

1.打开文件

函数:

FILE *fopen(char *filename, *type);

这个函数是返回一个指针类型,如果文本读取成功就返回文本的地址,如果读取失败就返回NULL空指针。

*type是表示操作编码,比如 r 表示对文件的读取、w 表示对文件的写入

示例:

FILE *fp;fp=fopen("text.txt","r");//表示对文件的读取

2.文件的读取

读取的操作:fopen("text.txt","r");

(1) fgetc 函数

原型:int fgetc( FILE *stream );

返回值:如果读取成功就返回一个读取的字符(类似于getchar),直到读取完成返回EOF(阿斯克码数值为-1)表示结束。每次是读取一个字符,读取完成后,文件指针向后移动一个位置。

示例如下:

已知我的文件内容

#include<stdio.h>
#include<stdlib.h>//exit()函数的头文件
int main()
{FILE* fp;fp = fopen("text.txt", "r");if (feof(fp)){printf("NULL");exit(0);//表示如果读取为空文件就正常退出}char a;a = fgetc(fp);printf("%c", a);//在控制台输出读取的字符
}

fgetc函数每次是读取一个字符,读取完成后文件指针向后移动一个位置,当下一次读取就是第二个字符对此我们可以通过循环来实现文件内容的全部读取。例如:

 char a;for(; (a = fgetc(fp))!=EOF;)printf("%c", a);

(2)fgets 函数

原型:char *fgets( char *str, int numChars, FILE *stream );

参数:str表示字符串的地址,numChars表示要读取字符最大个数,stream表示文件的地址

返回值:将文件的字符传入到字符串str的地址,然后返回str地址。

#include<stdio.h>
#include<stdlib.h>//exit()函数的头文件
int main()
{FILE* fp;fp = fopen("text.txt", "r");if (feof(fp)){printf("NULL");exit(0);//表示如果读取为空文件就正常退出}char s[100];fgets(s, 10, fp);//最大读取10个printf("%s", s);
}

(3)fscanf 函数

原型:int fscanf( FILE *stream, const char *format , argument ... );

参数:steam是文件地址,format是表示输出的参数,argument是表示输出的内容。

返回值:返回包括读取成功转换并且分配的字段数,如果读取错误或者读取到文件的末尾就返回EOF。

读取输出字符串:

char s[100];fscanf(fp, "%s", s);//将读取的内容导入字符串s的地址printf("%s", s);

读取输出单个字符:

char a;fscanf(fp, "%c", &a);//读取单个字符导入a的地址printf("%c", a);

读取输出整数:

 int b;fscanf(fp, "%d", &b);printf("%d", b);

fscanf是一个比较通用的函数,可以输出单个字符,多个字符,整形等。

(4)fread 函数

原型:size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

参数:buffer表示读取的类型的地址,size_t size表示读取需要的字节数,size_t count表示读取的个数,stream表示文本文件地址

返回值:fread 返回函数读取的完整项数,该数目可能小于 count 发生错误的情况,或者在到达 count之前遇到文件的末尾。

#include<stdio.h>
#include<stdlib.h>//exit()函数的头文件
int main()
{FILE* fp;fp = fopen("text.txt", "r");if (feof(fp)){printf("NULL");exit(0);//表示如果读取为空文件就正常退出}
//魔鬼细节:使用fread函数读取有限个字符要对字符串进行初始化,也就是给字符串加上终止符char a[7] = { 0 };//实际上我要读取6个字符,但是我初始化要7个,最后一个是表示终止符fread(a, sizeof(char), 6, fp);printf("%s", a);
}
 char a[7] ;memset(a, 0, sizeof(a));//我们还可以通过memset 函数来进行初始化,其头文件是#include<string.h>fread(a, 1, 6, fp);printf("%s", a);

fread函数是一个非常灵活的函数,我们可以用它来自定义读取文件字符的个数类型等等。

3.关闭文件

fclose(FILE *stream );

stream是文本文件地址

fclose(fp);//fp是文本地址 FILE *fp

4.文件的写入

写入的操作:fopen("text.txt","w");

注意事项:写入文件后要关闭文件,否则文件内容可能会丢失。

(1)fpuc 函数

原型:int fputc( int c, FILE *stream );

参数:c表示要写入的字符,stream表示文件地址。

返回值:返回值是写入的一个字符,当返回EOF表示一个错误,结束写入。

注意:写入内容后,之前的内容会被销毁。

#include<stdio.h>
#include<stdlib.h>//exit()函数的头文件
int main()
{FILE* fp;fp = fopen("text.txt", "w");if (feof(fp)){printf("NULL");exit(0);//表示如果读取为空文件就正常退出}fputc('s', fp);//写入一个字符s
fclose(fp);
}

此时会发现运行结果控制台是没有什么显示的,我们可以去打开text文本文件去查看结果

//类似于fgetc函数,我们也可以用循环来写入多字字符
char ch[10];scanf("%s", ch);for (int i = 0; ch[i]!='\0'; i++)fputc(ch[i], fp);

(2)fputs 函数

原型:int fputs( const char *str, FILE *stream );

参数:str表示字符串,stream表示文件地址

返回值:如果每个函数成功,则返回非负值,即写入的字符串。 发生错误时,fputs  将返回 EOF。

示例:

fputs("china", fp);
//或者
char s[10];
scanf("%s,s);
fputs(s, fp);

(3)fprintf 函数

原型:int fprintf( FILE *stream, const char *format , argument ... );

参数:steam是文件地址,format是表示输出的参数,argument是表示输出的内容。

返回值:fprintf 返回已写入的字节数,如果输入错误就返回EOF表示输入结束。

for(int i=0;i<10;i++)fprintf(fp, "%d", i);//写入0~9
//字符串写入
char ch[20];scanf("%s", ch);fprintf(fp, "%s", ch);

(4)fwrite 函数

原型:size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );

参数:buffer表示读取的类型的地址,size_t size表示读取需要的字节数,size_t count表示读取的个数,stream表示文本文件地址。

返回值:fwrite 返回函数写入的完整项数,这可能小于 count 发生错误的情况。

#include<stdio.h>
#include<stdlib.h>//exit()函数的头文件
int main()
{FILE* fp;fp = fopen("text.txt", "w");if (feof(fp)){printf("NULL");exit(0);//表示如果读取为空文件就正常退出}int a[10];for (int i = 0; i < 10; i++)//写入10个数字的数组scanf("%d", &a[i]);for (int i = 0; i < 10; i++)fwrite(&a[i],sizeof(int),1,fp);
}

 别惊讶,写入的结果不是数字,因为fwrite写入的内容会转换成阿斯克码字符,随机数在文件里面显示的应该是字符,而不是数字,所以会出现这些识别不了的符号。

5.文本文件的指针定位

(1)rewind 函数

原型:void rewind(FILE *stream)

参数:stream是文件地址.

功能:将文本文件的指针返回到文本的开始位置。

示例:

(2)fseek 函数

原型:int fseek( FILE *stream, long offset, int origin );

参数:stream文本地址,offset表示移动的字节数(正数表示指针往右移,负数表示往左移), origin表示初始位置。

功能:我们可以通过fseek函数来初始化指针的位置,然后进行读取或者写入。

origin 初始位置的值如下,及其相应的功能

示例:怎么去读取最后一行的字符串?

已知文件的内容:

#include<stdio.h>
#include<stdlib.h>//exit()函数的头文件
int main()
{FILE* fp;fp = fopen("text.txt", "r");if (feof(fp)){printf("NULL");exit(0);//表示如果读取为空文件就正常退出}char a='a';fseek(fp, -1, SEEK_END);//把文件指针移动到文本末尾for (;a!='\n';){a = fgetc(fp);//依次读取fseek(fp, -sizeof(char), SEEK_CUR);//由于每次读取了一个字符,文件指针会往后移动一个位置,所以要-2,从而实现在原先的基础上往上移动一个位置}fseek(fp,2, SEEK_CUR);//最后一次移动是在'\n'上面两个(字节)位置,所以要在次基础上向后移动两个位置char s[200] = { 0 };fgets(s,200, fp);puts(s);fclose(fp);
}

结果如下:

C语言 文本文件读取、写入与定位(详细介绍)相关推荐

  1. c语言怎样计算栈的长度,C语言 栈的表示和实现详细介绍

    C语言 栈的表示和实现详细介绍 定义:栈是限定仅在表尾进行插入和删除操作的线性表. 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入 ...

  2. c语言中 的优先级几级,C语言中的操作符优先级的详细介绍

    C语言中的操作符优先级的详细介绍 C语言中操作符的优先级大全, 当然c++, Objective-C,大部分语言都试用. 下面是来自The C Programming Language 2th的总结. ...

  3. c语言中左移右移有什么作用,C语言中左移和右移运算符详细介绍

    搜索热词 C语言中左移和右移运算符详细介绍 左移运算符(< 左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出 ...

  4. R语言批量读取写入Excel数据 r导出输出写入excel多个sheet 导出excel 导入 excel 读入excel 表格

    前一段,写过一篇:R语言中写入Excel的不同sheet表格,最近学习了tidyverse的方法,感觉需要总结一下,更新一下知识结构. 本文准备用实际数据,做一下操作: 「批量读取:」 批量读取多个E ...

  5. R语言批量读取写入Excel数据

    本文准备用实际数据,做一下操作: 「批量读取:」 批量读取多个Excel数据 批量读取一个Excel数据的不同表格 「批量写入」 批量写入Excel数据 1,批量写入到不同的Excel中 2,批量写入 ...

  6. python语言程序设计实践教程答案实验六_Python语言程序设计实验指导与习题--详细介绍...

    上机实践是学习程序设计的重要教学环节.只有通过上机实践,才能真正理解程序设计的基本思想,正确灵活地使用语言中的各种要素,熟练掌握各种集成开发环境的应用和编写.调试程序的方法,从而获得应用程序设计解决实 ...

  7. R语言爬虫之rvest包——基础详细介绍+示例

    为什么要学习R语言 都说Python爬虫功能强大,其实遇到动态加载或者登陆网站Python还是很困难,对于大部分的一些普通爬虫,R语言还是很方便.这里介绍R语言rvest包爬虫,主要用到函数:read ...

  8. 玻璃管标签的材质、读取、应用领域详细介绍

    由于RFID电子标签应用领域广泛,因此大家对电子标签了解得更多,但玻璃管标签却很少出现在大家视野,因此健永科技针对玻璃管标签的材质.读取.应用领域做详细介绍,希望大家能对玻璃管标签有更全面的了解. 应 ...

  9. 【Nvidia】nvidia 高级特性MIG详细介绍(一)

    博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G ...

最新文章

  1. 正则数字和小数点_Python中的正则表达式【不断补充~】
  2. ios - Push远程通知代码设置 DeviceToken
  3. keepalived VRRP同步组配置
  4. opencv图像清晰度计算_收藏|分析君带你认识Python中的十大图像处理工具
  5. 小白带你入坑xamarin系列之环境搭建和准备
  6. linux 常用命令01
  7. python第六篇:Python复制超大文件、复制二进制文件
  8. 跨平台开发与原生开发优劣比较
  9. JavaScript DOM 编程艺术(第2版)读书笔记 (7)
  10. 利用Samba搭建Backup Server配置文件
  11. c++输出的值精确到小数点后5位_直击灵魂——圆周率小数点后3位到12411亿位到底有啥用?...
  12. Android腾讯微博开放平台入门(一)开题与BaseString
  13. Home Assistant -ESP Home接入homekit篇
  14. proteus不能打开一直在开启界面转圈
  15. 一起写RPC框架(七)RPC网络模块的搭建五 Netty模块
  16. php theexcerpt,wordpress函数get_comment_excerpt()用法示例
  17. 编写类A2, 定义方法find, 实现查找某字符串数组中的元素查找,并返回索引,如果找不到,返回-1
  18. rt-n18u usb3.0 linux ex,【晒一下论坛晒单奖品】华硕RT-N18U多功能无线路由器2.4G 600Mbps...
  19. [总结]Android系统体系结构
  20. iOS 开发之使用苹果测试工具 TestFlight (进行内部和外部测试)

热门文章

  1. JAVA 面试背 通过_java面试题背不下来怎么办?java面试题总结
  2. windows系统C#(.Net)MySql数据库同步工具
  3. 小猪o2o生活通v2.82 全开源尊享版+多城市
  4. dlib中的人脸识别原理
  5. auot lisp 选择集处理_选择一体化预制泵站!这些方面不容忽视
  6. 《Building and Environment》期刊介绍(SCI 2区)
  7. 基于I2C的温度采集实验及实验心得
  8. c语言预测未来身高的编程源代码,C语言选择结构程序设计编程题
  9. 查看自己电脑上的机器码教材
  10. win10 远程桌面 登录没有成功