这两天看到一个关于文件读写的题目,索性就把相关内容总结下。

C语言文件读写,无非是几个读写函数的应用,fopen(),fread(),fwrite()等,下面简单介绍下。

一、fopen()


  函数原型:FILE *fopen(const char *path, const char *mode);

  参数说明:path,所打开的文件名(包含文件路径,缺省值为当前工程目录);mode:流形态,后文详述。

  返回值:文件指针。打开失败,返回NULL;打开成功,返回指向该流的文件指针。

  mode详解:mode就是打开文件的方式,读写?二进制?追加在文件末?等等。

  r: 只读方式,文件需存在

  r+: 读写方式,文件需存在

  rb+: 读写二进制(binary)文件,不过好像只读(可以自己测试)

  rw+: 读写文本文件

  w: 只写文件。若文件存在,则覆盖原内容;若不存在,新建文件

  w+: 读写。若文件存在,(写时)则覆盖原内容;若不存在,新建文件

  a: append, 只写文件。若文件存在,追加写的内容到文件末;若不存在,新建文件

  a+: append,读写文件。若文件存在,追加写的内容到文件末;若不存在,新建文件

  wb:  只写。二进制文件。若不存在,新建文件

wb+: 读写。二级制文件。若不存在,新建文件。

  值得注意的是,有的编译器支持rw等参数,就好比linux中文件的属性(rwx-421)。

二、fopen(), fwrite()


  1)函数原型: size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

    参数说明:ptr:数据buffer位置;size:每个数据类型的大小: count:数据的个数; stream:文件指针,指向待读取的文件

  2)函数原型:size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

   参数说明: ptr,数据buffer位置; 每个数据类型的大小: count:数据的个数; stream:文件指针,指向待写入的文件

  注意:这两个函数也是配套fopen()函数来操作的,其读写文件的方式取决于fopen函数的mode参数。

三、文件读写实例


  这里,我们把一堆结构体数据写入我的文件“myfile.dat”, 然后再从中读取出来,回显在console上。

 #include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct
{
int num;
char name[];
char tel[];
} STYPE;
void check (); int fun (STYPE *std)
{
FILE *fp = NULL; //定义时,fp最好指向空吗?
int i;
if ((fp = fopen ( "myfile.dat ", " wb ")) == NULL) return ; printf(" \noutput data to file ! \n");
for ( i = ; i < N; i ++ )
fwrite (&std[i], sizeof (STYPE), , fp);
fclose (fp);
fp = NULL;
return ;
} int main ()
{
STYPE s[] = { { , "aaaaa", ""},
{ , "bbbbb", ""},
{ , "ccccc", ""},
{ , "ddddd", ""},
{ , "eeeee", ""} };
int k;
k = fun(s);
if (k == )
{
printf("Succeed !");
check() ;
}
else
printf ( " Fail !");
} void check()
{
FILE *fp = NULL ; //定义时,fp最好指向空吗??
int i;
STYPE s[];
if ((fp = fopen ("myfile.dat ", "rb")) == NULL)
{
printf ( "Fail ! \n");
exit ();
}
printf ("\nRead file and output to screen :\n");
printf ("\n num name tel \n");
for ( i = ; i < N; i++ )
{
fread (&s[i], sizeof ( STYPE ), , fp);
printf (" % d %s %s \n", s[i].num, s[i].name, s[i].tel);
}
fclose (fp);
fp = NULL; //为了避免dangling pointer?
}

  程序运行结果说明:

  1)我们观察工程目录下,多了一个myfile.dat的文件

  

  2)回显在console

  

  注意事项:

  1)fclose(fp). 文件操作完成后,需要关闭文件流,可能会造成文件占用内存泄露;或者下次访问文件时,出现不可预料的问题

  2)fp = NULL. 文件关闭后,需要将文件指针指向NULL。防止dangling pointer。

  3) 在最开始定义文件指针时,需要将其指向NULL吗?仅从初始化的角度来看,指向NULL也许能避免一些安全问题。

3,C语言文件读写的更多相关文章

  1. c语言文件读写操作总结

    C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...

  2. C语言文件读写命令fprintf和fscanf

    以向文件中读取和写入二维数组为例. 以下是fprintf的使用:向文件中写入10*10的二维数组,数组元素为1~100之间的随机数. #include <stdlib.h> #includ ...

  3. C语言文件读写操作

    C语言实现文件读写,注意区分几个方法: 写入: fwrite() //个人认为这个最好,可是实现写入任何数据类型,任何长度 fputs() //写入一个字符串,字符串长度不能太长,具体的长度未知,但估 ...

  4. C++常用工具库(C语言文件读写,日志库,格式化字符串, 获取可执行文件所在绝对路径等)

    前言 自己常用的工具库, C++ 和C语言实现 使用cmake维护的项目 持续更新..... 提供使用范例, 详见example文件夹 windows使用的VS通过了的编译. Linux(Ubuntu ...

  5. C语言文件读写(结构体文件)

    有时候,我们需要将输入的数据存储起来,这时候就需要用到文件,对于C语言而言,文件的读写有多种方式,下面主要是结构体文件的读写,例如student.dat(第一列是学号,第二列是姓名) xiaoming ...

  6. C语言文件读写

    1.用fopen打开文件 该函数的原型为FILE *fopen(const char *filename, const char *mode),第一个参数是文件名,第二个参数是打开文件的模式. 打开文 ...

  7. [知识复习] C语言文件读写

    文件打开 fopen() 返回FILE* 对象,如果打开失败返回NULL,错误代码存入errno中 FILE *fopen( const char * filename, const char * m ...

  8. C 语言 文件读写

    在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之.一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:type ...

  9. C语言文件读写Demo

    CIODemo.c #include <stdio.h> #include <time.h> #define INPUT_BUFFER_SIZE 100 * 1024 int ...

随机推荐

  1. 如何用LinkedHashMap实现LRU缓存算法

    阿里巴巴笔试考到了LRU,一激动忘了怎么回事了..准备不充分啊.. 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的.LRU这个算法就是把最近一次 ...

  2. Android二维码开源项目zxing用例简化和生成二维码、条形码

    上一篇讲到:Android二维码开源项目zxing编译,编译出来后有一个自带的測试程序:CaptureActivity比較复杂,我仅仅要是把一些不用的东西去掉,用看起来更方便,二维码和条形码的流行性自 ...

  3. GridView行编辑、更新、取消、删除事件使用方法

    注意:当启用编辑button时,点击编辑button后会使一整行都切换成文本框.为了是一行中的一部分是文本框,须要把以整行的全部列都转换成模板,然后删掉编辑模板中的代码.这样就能使你想编辑的列转换成文 ...

  4. Cocos2d-x3.0游戏实例之《别救我》第四篇——乱入的主角

    好了,前面说了那么多废话,最终要进入正题了(等等,敢情前面你都是在耍我们么?) 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blo ...

  5. ButterKnife 绑定 RadioGroup

    原则上 ButterKnife 是不支持 RadioGroup 的, 可以通过以下方法添加RadioButton的点击事件: @OnClick({ R.id.radio_btn1, R.id.radi ...

  6. 2013年末、2014年初合辑——关于c语言的进阶学习

    太过于慵懒了,一个多月没有来自己的园子播种了.还是给自己找找借口吧,十二月末备战期末考试也是自己没心情码文字的理由吧,一月份理所当然地进入考试周,回家后做了个小手术也是客观上让自己不能静下心来回顾知识 ...

  7. JS 引用

    var arr1=[1,2,3,4]; var arr2=arr1; arr2.push(5); console.log(arr1);//和arr2一样 console.log(arr1==arr2) ...

  8. Android 通过Dom, Sax, Pull解析网络xml数据

    这篇文章不是完全原创,XML解析的部分参考了 liuhe688 的文章.文章地址:http://blog.csdn.net/liuhe688/article/details/6415593 这是一个几 ...

  9. 【源码】实现Android闹钟功能使用HTML+JS,并附带Alarm代码分享

    先是开发手册中最终功能的实现函数,再是Alarm接口的源码. 参数: argu:型如“key1=value1;key2=value2;......”的参数表.首先,该参数表支持 rexseeNotif ...

  10. express文件上传

    安装express,创建项目,添加sqlite3模块 express --sessions --css stylus --ejs myhotel npm install sqlite3node app ...