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

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. Web网页中动态数据区域的识别与抽取 Dynamical Data Regions Identification and Extraction in Web Pages

    Web网页中动态数据区域的识别与抽取 Dynamical Data Regions Identification and Extraction in Web Pages Web网页中动态数据区域的识别 ...

  2. java常用日期函数总结

    请记得要引入java.util.Date和java.text.SimpleDateFormat两个包 1.计算某一月份的最大天数 Calendar time=Calendar.getInstance( ...

  3. Delphi Excel FastReport

    unit Unit1; interface uses Printers,Windows, Messages, SysUtils, Variants, Classes, Graphics, Contro ...

  4. C#中数组、ArrayList和List三者的区别(转)

    好东西,总结的很到位,收藏了! 源地址:http://blog.csdn.net/zhang_xinxiu/article/details/8657431

  5. 通过配置Tomcat,让Android真机通过局域网访问PC的文件

    在 Tomcat 根目录,找到conf\server.xml文件. 1.打开server.xml查找修改端口为8080端口: <Connector port="8080" p ...

  6. iOS实践02

    第二天了,上了一天课,软件测试.数据挖掘.概率论,晚上了才有时间捣鼓捣鼓程序. 今天只是简单的做了一点.觉得自己思考的写不出来,只能简单的写一个过程,不像第一次写这个,少了很多思考的. 1.完善tab ...

  7. ASP.NET产生随机验证码

    效果图:(Flowing) 1.项目中新建用于存储(位图)图片文件夹 图解: 2.前台可以添加一ASP.NET控件或其他任意用来展示图片标签等(如下) <div> <asp:Imag ...

  8. Lucence.net索引技术 二

    一. Lucene索引创建和优化 [版本2.9.0以上] Lucene索引的创建首先需要取得几个必须的对象: 1.分词器//可以采用其他的中文分词器 StandardAnalyzer analyzer ...

  9. Python开发环境Spyder安装方法

    Spyder(Scientific PYthon Development EnviRonment)是一个强大的交互式 Python 语言开发环境,提供高级的代码编辑.交互测试.调试等特性,支持包括 W ...

  10. [LeetCode]题解(python):001-Two-Sum

    题目来源: https://leetcode.com/problems/two-sum/ 题意分析: 这道题目是输入一个数组和target,要在一个数组中找到两个数字,其和为target,从小到大输出 ...