文件是C语言中德中的重点,小编在学习C语言基础知识的时候,大多数的输入输出操作是在屏幕上进行的,现在总算在文件学习上感觉到高大上的样纸。在以前数据量很小时,我们通常将信息从键盘在屏幕上进行输入输出的,but当数据量很大时,则显得很麻烦,因此,我们就要用到小编所说的文件(FILE)。

本贴主要涉及到的知识点具有:

  • 文件读操作;
  • 文件写操作;
  • 文件指针。

一、文件(FILE)简介

  在C语言中,文件是由一个个字符组成的,文件中的内容称为文件流。

  文件可以分为两种:ASCII文件和二进制文件。

  • ASCII文件是通过字符来存储信息的,具有可读性;
  • 二进制文件是通过二进制形式来存储信息的,即使用一连串的二进制数来表示,适用于非字符为主的数据。如果以记事本打开,只会看到一堆乱码。 因此,除了文本文件外,所有的数据都可以算是二进制文件。二进制文件的优点在于存取速度快,占用空间小,以及可随机存取数据。

  1.1、缓冲文件

  根据文件处理方法,文件又可分为:缓冲文件和非缓冲文件两种。但是在标准C语言中则采用缓冲文件。

  首先来了解下缓冲区(buffer):指在程序执行时,所提供的额外内存,可用来暂时存放做准备执行的数据。它的作用就是作为中介实现文件的相关操作,为了提高存取效率,因为内存的存取速度比磁盘驱动器快得多。

  缓冲文件:当进行文件的读操作时,会从文件中读取一部分数据至缓冲区中,再将缓冲区中的文件读取到相应地变量中。当进行文件的写操作时,先将数据写到数据缓冲区中,若缓冲区存储空间满了,再将缓冲区中内容写到文件中。简言之,缓冲区中数据所在的文件就是缓冲文件。

  缓冲文件实现文件的读、写操作是通过指针来实现的。

  文件的定义形式为:

 FILE *指针名;

  通过指针来进行文件的相关操作。

  1.2、文件指针和位置指针

  在对一个文件进行操作之前,首先要定义一个文件指针。指针定义之后通过fopen()函数给文件指针赋值,即使文件指针指向相应的文件。文件指针赋值之后,就可以通过文件指针对文件进行读写等操作。

  位置指针用来指明文件当前操作的位置。当调用fopen()函数打开相应文件之后,文件位置指针指向文件开头的第1个字符。当文件位置指针指向文件最后一个字符时,则表示文件结束标志。(C语言中使用feof()函数来检测文件位置指针是否移动到末尾)。

  C语言feof()函数的使用:正确的应该是feof()函数返回0表示文件没有结束,返回1,表示结束。feof()函数实际观察的是上次读操作的内容,也就是上次读操作fread()函数返回的值,如果读操作的返回值表明读取的不是空,那feof()函数就返回0,如果上次读操作失败了,则feof返回1,表示读取完了。而fread()函数返回值是表示正确读取的块数,如果不够,则返回0。  

二、与文件有关的库函数

  2.1文件的打开和关闭函数

  fopen()函数

  打开一个文件是通过fopen()函数来实现的。fopen()函数的调用形式如下:

  file1 = fopen(文件名, 文件操作方式);

  例如:

  FILE *file1;
file1 = fopen("/Users/xxxx/Desktop/input.txt", "r")

  通过调用fopen()函数打开当前目录下的input.txt文件,并只能对文件进行写操作,不能进行读操作,是文件指针file1指向文件input.txt,且指向该文件的起始位置(在描述文件路径的时候,要注意绝对路径与相对路径的区别)。

  为了判断文件是否打开,可以通过fopen()函数的返回值进行判断。

  例如:

if ((file1 = fopen("/Users/xxxx/Desktop/input.txt", "r")) != nil)
{
for (int i = ; i < ; i++)
fread(&s[i], sizeof(struct st), , file1);
}else
{
printf("file1文件打开错误\n");
exit();
}

  若文件打开失败,则函数fopen()会返回一个null值,因此可以通过判断fopen()函数的返回值来判断文件是否正常打开。

  文件的操作方式

  mode:打开的模式,规定了是可读、可写、追加之类的属性。
  "r":可读,如果文件不存在,fopen调用失败
  "w":可写,如果文件存在,那么原来的内容会被销毁。
  "a":在文件尾追加,在新的数据写到文件里之前,不改变EOF标记,如果文件不存在,创建一个新的文件。
  "r+":可读可写,文件必须存在。
  "w+":打开一个空文件用来读写,如果文件存在,则内容被销毁。
  "a+":可读可追加,在新的数据写到文件里之前,改变EOF标记;如果文件不存在,创建一个新的文件。

  fclose()函数

  当对一个文件的操作结束以后,为防止数据内容被改变,就应关闭文件。关闭文件之后,文件指针不再指向文件,除非重新初始化。

  文件通过调用fclose()函数实现,其调用形式如下:

    FILE *file1,;
if ((file1 = fopen("/Users/xxxx/Desktop/input.txt", "r")) != nil)
{
insert code here。
} fclose(file1);

  通过fclose()函数切断了指针file1与文件之间的联系,即关闭了文件。

  2.2、文件的读写函数

  文件的读写函数有很多种,其中包括fputc()函数、fgetc()函数、fread()函数、fwrite()函数、fprintf()函数和fscanf()函数等。

  这里小编就以fread()函数、fwrite()函数两个函数举例说明:

  fread()函数

  调用形式:

fread(buffer, size, count, file1);

  功能:从文件中读取一个数据块,其中buffer为指针类型,表示从文件中读取数据存放的地址。size表示一次读取的字节数,count表示进行多少次的读操作,file1为文件指针,只想要进行操作的文件。

  例如以下demo:

struct st
{
char name[];
char age[];
char sex[];
float score;
}s[]; int main(int argc, const char * argv[])
{
for (int i = ; i < ; i++)
fread(&s[i], sizeof(struct st), , file1);
for (int i = ; i < ; i++)
printf("%s,%s,%s,%f",s[i].name,s[i].age,s[i].sex,s[i].score);
return ;
}

  执行完这些语句,结构体数组s保存了用户的信息,因为fread()函数是将数据写至变量地址中的,因此该参数必须为变量的地址。

  fwrite()函数

  调用形式:

 fwrite(buffer, size, Count, file1);

  功能:向文件中写入一个数据块,其中buffer为指针类型,表示从文件中读取数据存放的地址。size表示一次读取的字节数,count表示进行多少次的读操作,file1为文件指针,只想要进行操作的文件。

  例如以下demo:

struct st
{
char name[];
char age[];
char sex[];
float score;
}s[];
int main(int argc, const char * argv[])
{
for (int i = ; i < ; i++)
scanf("%s,%s,%s,%f",&s[i].name,&s[i].age,&s[i].sex,&s[i].score);
for (int i = ; i < ; i++)
fwrite(&s[i], sizeof(struct st), , file2);
return ;
}

下面是以上函数的简单例子:

  By the structure pointer ,to the operation of the file for reading and writing

 #include <stdio.h>
#include <stdlib.h> struct st
{
char name[];
char age[];
char sex[];
float score;
}s[]; int main(int argc, const char * argv[])
{
//By the structure pointer ,to the operation of the file for reading and writing
FILE *file1, *file2;
if ((file1 = fopen("/Users/xxxxDesktop/input.txt", "r")) != nil)
{
for (int i = ; i < ; i++)
fread(&s[i], sizeof(struct st), , file1);
}else
{
printf("file1文件打开错误\n");
exit();
}
if ((file2 = fopen("/Users/xxxx/Desktop/ouput.txt", "w")) != nil)
{
for (int i = ; i < ; i++)
fwrite(&s[i], sizeof(struct st), , file2);
}else
{
printf("file2文件打开错误\n");
exit();
}
fclose(file1);
fclose(file2); return ;
}

  其运行的最终结果如下图:

C语言应用操作之文件的更多相关文章

  1. 位图文件格式及linux下C语言来操作位图文件

    说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP.由于没有经过任何的压缩,故BMP图片往往很大.在Windows下,任何格式的图片文件都要转 ...

  2. 【Go语言】集合与文件操作

    本文目录 1.数据集合的主要操作 1_1.字典的声明 1_2.字典的初始化和创建 1_3.字典的访问和操作 1_4.其他类型的数据集 2.文件操作 2_1.文件操作概述os包和path包 2_2.文件 ...

  3. C++学习(二十八)(C语言部分)之 文件操作

    复习:#define 定义一个宏#include 文件包含#if 条件防止头文件重复包含定义一个宏 判断宏是否定义 判断头文件是否包含#define _STDIO_H_#include<stdi ...

  4. go语言中常用的文件和文件夹操作函数

    package main; import ( "os" "log" "time" "fmt" ) //一些常用的文件操作 ...

  5. 归纳整理Linux下C语言常用的库函数----文件操作

    在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...

  6. C语言字符串操作总结大全(超详细)

    本篇文章是对C语言字符串操作进行了详细的总结分析,需要的朋友参考下 1)字符串操作  strcpy(p, p1) 复制字符串  strncpy(p, p1, n) 复制指定长度字符串  strcat( ...

  7. 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

    转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...

  8. JAVA调用C语言写的SO文件

    JAVA调用C语言写的SO文件 因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 // 用JNI实现 // 实例: ...

  9. C#操作Excel文件(转)

    摘要:本文介绍了Excel对象.C#中的受管代码和非受管代码,并介绍了COM组件在.net环境中的使用. 关键词:受管代码:非受管代码:Excel对象:动态连接库 引言 Excel是微软公司办公自动化 ...

随机推荐

  1. xen list_domains stat 解析

    XenServer中可以使用list_domains命令来查看所有VM以及Dom0的运行状态以及简单的资源消耗,如下: [root@xenserver ~]# list_domains id | uu ...

  2. JVM内存管理---垃圾收集器

    说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态 ...

  3. 为什么mysqlbinlog --database选项不起作用

    群里看到有同学提问,多瞅了眼 [root@mysql55 mysql]# mysqlbinlog --no-defaults -vv --base64-output=decode-rows mysql ...

  4. 记webpack下进行普通模块化开发基础配置(自动打包生成html、多入口多页面)

    写本记时(2018-06-25)的各版本 "webpack": "^4.6.0"  //可直接使用4x以上的开发模式,刷新很快 "webpack-de ...

  5. Python基础教程-第3版(文字版) 超清文字-非扫描版 [免积分、免登录]

    此处免费下载,无需账号,无需登录,无需积分.收集自互联网,侵权通知删除. 点击下载:Python基础教程-第3版 备用下载:Python基础教程-第3版

  6. [转]GCC系列: __attribute__((visibility("")))

    在 objc-api.h 里面有很多关于__attribute__ 的定义. 例如 #if !defined(OBJC_VISIBLE) # if TARGET_OS_WIN32 # if defin ...

  7. CSS position:absolute浅析

    一.绝对定位的特征 绝对定位有着与浮动一样的特性,即包裹性和破坏性. 就破坏性而言,浮动仅仅破坏了元素的高度,保留了元素的宽度:而绝对定位的元素高度和宽度都没有了. 请看下面代码: <!DOCT ...

  8. 【Pyhon】利用BurpSuite到SQLMap批量测试SQL注入

    前言 通过Python脚本把Burp的HTTP请求提取出来交给SQLMap批量测试,提升找大门户网站SQL注入点的效率. 导出Burp的请求包 配置到Burp的代理后浏览门户站点,Burp会将URL纪 ...

  9. 【源码阅读】Mimikatz一键获取远程终端凭据与获取明文密码修改方法

    1.前言 mimikatz框架是非常精妙的,粗浅讲一下修改的思路. 它的模块主要由各个结构体数组组成,根据传入的命令搜索执行相应命令的模块 mimikatz.c 部分代码: NTSTATUS mimi ...

  10. 打包部署到tomcat

    部署到tomcat的方法 注意:在eclipse 或 idea 上需要引入外部tomcat 1.将程序打成war包启动tomcat 2.将target 文件下内容压缩城zip,发布到tomcat RO ...