精华内容
下载资源
问答
  • c语言文件的操作

    千次阅读 2017-02-28 19:22:12
    1.使用文件方式有哪些文件使用方式 含义 "r" 打开一个文本文件,只允许读操作     "w"(只写) 打开一个文本文件 "a"(追加) 打开一个文本文件,只允许读操作 "rb"(只读) 打开或建立一个文本...

    以下是c语言对文件的基本操作:

    1.使用文件的方式有哪些:

    文件使用方式 含义
    "r"       (只读) 打开一个文本文件,只允许读数据
    "w"      (只写) 打开或建立一个文本文件,只允许写数据
    "a"       (追加) 打开一个文本文件,并在文件末尾写数据
    "rb"     (只读) 打开一个二进制文件,只允许读数据
    "wb"   (只写) 打开或建立一个二进制文件,只允许写数据
    "ab"    (追加) 打开一个二进制文件,并在文件末尾写数据
    "r+"     (读写) 打开一个文本文件,允许读和写
    "w+"   (读写) 打开或建立一个文本文件,允许读和写
    "a+"    (读写) 打开一个文本文件,允许读,或在文件末追加数据
    "rb+"   (读写) 打开一个二进制文件,只允许读和写
    "wb+" (读写) 打开或建立一个二进制文件,允许读和写
    "ab+"  (读写) 打开一个二进制文件,允许读,或在文件末追加数据

    2.文件的打开函数fopen:

    其调用格式一般如下:
    FILE *fp;
    fp=fopen(文件名,使用文件方式);

    3.文件的关闭函数fclose:

    fclose(文件指针);
    例如:fclose(fp);

    4.文件的读写

    4.1  fputc函数

    fputc函数的作用是把一个字符写到磁盘文件(fp所指向的文件)中,其调用的一般格式如下:
    ch=fputc(ch,fp);
    其中,ch是要输出的字符,它可以是一个字符常量,也可以是一个字符变量;fp是文件指针变量。当函数输出成功则返回值就是输出的字符;如果输出失败,则返回EOF。

    4.2 fgetc函数

    fgetc函数的作用是从指定的文件(fp指向的文件)读入一个字符赋给ch(注意,该文件必须是以读或读写的方式打开)。当函数遇到文件结束符时将返回一个文件结束标志EOF。
    其调用的一般格式如下:
    ch=fgetc(fp);

    4.3 fread函数和fwrite函数

    fputc和fgetc函数每次只能读写文件中的一个字符,但是在编写程序的过程中往往需要对整块数据进行读写,列如对一个结构体类型变量值进行读写,此时就用到了fread和fwrite函数。

    1.fread函数

    fread函数的作用是从fp所指向的文件中读入count次,每次读size字节,读入的信息存储在buffer地址中。

    fread函数的一般格式如下:
    fread(buffer,size,count,fp);

    2.fwrite函数

    fwrite函数的作用是将buffer地址开始的信息输出count次,每次写size字节到fp所指向的文件。

    fwrite函数的一般格式如下:
    fwrite(buffer,size,count,fp);
    例如:
    fread(a,2,3,fp);
    其含义是从fp所指向的文件中,每次读2个字节送入数组a中,连续读3次。
    fwrite(a,2,3,fp);
    其含义是将a数组中的信息每次输出2个字节到fp所指向的文件中,连续输出3次。

    5.文件的定位

    要实现搜索定位功能,除了fseek函数外,还有两个函数在编写程序的过程中也会经常遇到,即rewind函数和ftell函数。

    5.1 rewind函数

    rewind函数的作用是使位置指针重新返回文件的开头,该函数没有返回值。
    rewind函数的一般格式如下:
    int rewind(文件类型指针)

    5.2 ftell函数

    ftell函数的作用是得到流式文件中的当前位置,用相对于文件开头的位移量来表示。当ftell函数返回值为-1L时,表示出错。

    ftell函数的一般格式如下:
    long ftell(文件类型指针)
    例如:
    long i;
    if((i=ftell(fp))==-1L)
        printf("error");

    5.3 fseek函数

    fseek(文件类型指针,位移量,起始点);

        该函数的作用是移动文件内部位置指针。其中,"文件类型指针"指向被移动的文件;"位移量"表示移动的字节数,要求位移量是long型数据,以便在文件长度在大于64k时,常用常量表示位移量时,要求加后缀"L";"起始点"表示从何处开始计算位移量,规定的起始点有3种,即文件首、当前位置和文件末尾。

    起始点 表示符号 字数表示
    文件首 SEEK-SET 0
    当前位置 SEEK-CUR 1
    文件末尾 SEEK-END 2

    例如:
    fseek(fp,-20L,1);
    表示将位置指针从当前位置向后退20个字节。
    说明:
    fseek函数一般用于二进制文件;在文本文件中由于要进行转换,故往往计算的位置会出现错误。对文件进行随机读写时,在移动位置指针后,即可以用前面介绍的任一读写函数进行读写。


    实例:合并两个文件的内容
    /*合并两个文件的内容*/
    #include<stdio.h>
    #include<stdlib.h>
    
    int main()
    {
    	char ch,filename1[50],filename2[20];   /**/
        FILE *fp1,*fp2;                            /*定义两个指向FILE类型结构体的指针*/
        printf("please input filename1:\n");
    	scanf("%s",filename1);                      /*输入文件所在的路径名称*/
    	if((fp1=fopen(filename1,"a+"))==NULL)        /*在文件末尾追加的方式打开*/
    	{
    		printf("无法打开此文件!\n");
    		exit(0);
    	}
    	printf("file:\n");
    	ch=fgetc(fp1);
    	while(ch!=EOF)                             /*将文件1中的内容输出*/
    	{
    		putchar(ch);                           /*putchar()一次输出一个字符*/
    		                                       /*fgetc()一次读取一个字符*/
    		ch=fgetc(fp1);
    	}
    	printf("\n请输入文件2的名字:\n");
    	scanf("%s",filename2);
    	if((fp2=fopen(filename2,"r"))==NULL)        /*以只读的方式打开*/
    	{
    		printf("无法打开此文件!\n");
    		exit(0);
    	}
    	printf("file2:\n");
        ch=fgetc(fp2);
    	while(ch!=EOF)                             /*将文件2中的内容输出*/
    	{
    		putchar(ch);                           /*putchar()一次输出一个字符*/
    		                                       /*fgetc()一次读取一个字符*/
    		ch=fgetc(fp2);
    	}
        fseek(fp2,0L,0);                       /*将文件2中的位置指针移到文件开始处*/
    	ch=fgetc(fp2);
    	while(!feof(fp2))
    	{
    		fputc(ch,fp1);                     /*将文件2中的内容输出到文件1中*/
    		ch=fgetc(fp2);
    	}
    	fclose(fp1);
    	fclose(fp2);
    	return 0;
    }
    
    合并前文档的内容

         


    最后补充一点有时候为什么把东西写进文件后变成了乱码????????????

    展开全文
  • C语言编程要点

    2017-09-18 00:10:37
    12.13. 适用于整数和浮点数的数学函数分别有哪些? 184 12.14. 什么是多字节字符(multibyte characters)? 185 12.15. 怎样操作由多字节字符组成的字符串? 186 第13章 时间和日期 186 13.1. 怎样把日期存储到单个数字...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    *2.5 在C语言中是否模拟继承等面向对象程序设计特性的好方法? 2.6 为什么声明externf(structx*p);给我报了一个晦涩难懂的警告信息? 2.7 我遇到这样声明结构的代码:structname{intnamelen;charnamestr[1];}...
  • 难道在C语言中一个结构不能包含指向自己的指针吗? o 2.7 怎样建立和理解非常复杂的声明?例如定义一个包含 N 个指向返回指向字符的指针的函数的指针的数组? o 2.8 函数只定义了一次, 调用了一次, 但编译器提示...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    *2.5 在C语言中是否模拟继承等面向对象程序设计特性的好方法? 22 2.6 为什么声明extern f(struct x *p); 给我报了一个晦涩难懂的警告信息? 23 2.7 我遇到这样声明结构的代码:struct name {int namelen; ...
  • *2.5 在C语言中是否模拟继承等面向对象程序设计特性的好方法? 22 2.6 为什么声明extern f(struct x *p); 给我报了一个晦涩难懂的警告信息? 23 2.7 我遇到这样声明结构的代码:struct name {int namelen; ...
  • 你必须知道的495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    难道在C语言中一个结构不能包含指向自己的指针吗? . . . . 3 1.7 怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返 回指向字符的指针的函数的指针的数组? . . . . . . . . . . . . . . 3 1.8 函数只定义...
  • c++异常

    2020-10-27 20:29:50
    二、C语言传统的处理错误的方式有哪些呢?1.返回错误码2.终止程序三、传统的处理错误的缺陷?四、异常的使用?1.异常的抛出和捕获2.异常重新抛出五、自定义异常体系总结 前言 许多的学员对异常处理视而不见,程序里...


    前言

    许多的学员对异常处理视而不见,程序里很少考虑异常情况。一部分人甚至根本就不考虑,以为程序总是能以正确的途径运行。例如我们有的学员调用fopen打开一个文件后,立马就开始进行读写操作,根本就不考虑文件是否正常打开了。这种习惯一定要改掉,纵使你再不愿意!这是软件健壮性的需要!异常处理不是浪费时间!

    一、异常是什么?

    异常是面向对象语法处理错误一种方式

    二、C语言传统的处理错误的方式有哪些呢?

    1.返回错误码

    有些API接口都是把错误码放到errno中

    2.终止程序

    比如发生越界等严重问题时,我们也可以主动调用exit(xx) assert;

    三、传统的处理错误的缺陷?

    1.拿到错误码,需要查找错误码表,才知道是什么错误。
    2.如果一个函数是通过返回值拿数据,发生错误时很难处理。

    T& operator[](int index)
    {
    	// 如果index超出的容器范围,如何返回?
    }
    

    3.如果调用的函数栈很深,一层层返回错误码,整个处理很难受

    四、异常的使用?

    1.异常的抛出和捕获

    原则:
    1.异常是根据抛出对象而引发的,该对象的类型决定了应该激活哪个catch的处理代码
    2.被选中的处理代码是与该对象类型匹配且抛出异常位置最近的那一个.
    3.抛出异常对象后,会生成一个异常对象的拷贝,这个临时对象会在被catch以后被销毁
    4.catch(…)可以捕获任意类型的异常
    5.实际中,我们可以抛出的派生类对象,使用基类捕获.
    在函数调用链中异常栈展开匹配原则

    1. 首先检查throw本身是否在try块内部,如果是再查找匹配的catch语句。
    2. 如果到达main函数的栈,依旧没有匹配的,则终止程序
    namespace bit
    {
    	int div(int n, int m)
    	{
    		if (m == 0)
    		{
    			//throw "发生除0错误";
    			throw string("发生除0错误"); // throw 可以抛出任意类型的对象
    			//throw - 1;
    			// 直接跳转到catch匹配的地方
    		}
    		return n / m;
    	}
    }
    
    void f1()
    {
    	try{
    		int n, m;
    		cin >> n >> m;
    		cout << bit::div(n, m) << endl;
    	}
    	catch (const string& err)
    	{
    		cout << __LINE__ << err << endl;
    	}
    }
    
    int main()
    {
    	try
    	{
    		f1();
    	}
    	catch (int err)
    	{
    		cout <<err << endl;
    	}
    	catch (const string& err)
    	{
    		cout << __LINE__ << err << endl;
    	}
    	catch (...) // 捕获没有匹配的任意类型的异常,避免异常没捕获时程序直接终止了
    	{
    		cout << "未知异常" << endl;
    	}
    }
    

    2.异常重新抛出

    异常可能会导致异常安全问题

    double Division(int a, int b) {
    	// 当b == 0时抛出异常
    	if (b == 0)
    	{
    		throw "Division by zero condition!";
    	}
    	return (double)a / (double)b;
    }
    void Func()
    {
    	// 这里可以看到如果发生除0错误抛出异常,另外下面的array没有得到释放。
    	// 所以这里捕获异常后并不处理异常,异常还是交给外面处理,这里捕获了再
    	// 重新抛出去。
    	int* array = new int[10];
    	try {
    		int len, time;
    		cin >> len >> time;
    		cout << Division(len, time) << endl;
    	}
    	catch (...)
    	{
    		cout << __LINE__<<"delete []" << array << endl;
    		delete[] array;
    		throw;
    	}
    	// ...
    	cout <<__LINE__<< "delete []" << array << endl;
    	delete[] array;
    }
    int main()
    {
    	try
    	{
    		Func();
    	}
    	catch (const char* errmsg)
    	{
    		cout <<__LINE__<< errmsg << endl;
    	}
    	return 0;
    }
    

    五、自定义异常体系

    以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了

    class Exception
    {
    public:
    	Exception(const char* errmsg, int errid)
    		: _errmsg(errmsg)
    		,_errid(errid)
    	{}
    
    	virtual string what() = 0;
    protected:
    	int _errid;       // 错误码
    	string _errmsg;   // 错误描述
    	//stack<string> _st; // 调用栈帧
    };
    
    class SqlException : public Exception
    {
    public:
    	SqlException(const char* errmsg, int errid)
    		:Exception(errmsg, errid)
    	{}
    
    	virtual string what()
    	{
    		return "数据库错误:" + _errmsg;
    	}
    };
    
    class NetworkException : public Exception
    {
    public:
    	NetworkException(const char* errmsg, int errid)
    		:Exception(errmsg, errid)
    	{}
    
    	virtual string what()
    	{
    		return "网络错误:" + _errmsg;
    	}
    };
    
    void ServerStart()
    {
    	// 模拟一下出现问题抛异常报错
    	if (rand() % 11 == 0)
    		throw SqlException("数据库启动失败", 1);
    
    	if (rand() % 7 == 0)
    		throw NetworkException("网络连接失败", 3);
    
    	cout << "正常运行" << endl;
    }
    
    int main()
    {
    	for (size_t i = 0; i < 100; i++)
    	{
    		try
    		{
    			ServerStart();
    		}
    		catch (Exception& e)
    		{
    			cout << e.what() << endl;
    		}
    		catch (...)
    		{
    			cout << "未知异常" << endl;
    		}
    	}
    	return 0;
    }
    

    总结

    /异常可能会导致异常安全问题

    //new / fopen / lock
    //
    //func();  // 如果抛异常就会有异常安全问题 -> 捕获重新抛出 or RAII 解决
    //
    //delete/fclose/ unlock
    

    函数规范一下,如果要抛异常,你说明清楚,不抛异常也说明一下, 但是现实中,很多人嫌麻烦,不遵守规范

    这里表示这个函数会抛出A/B/C/D中的某种类型的异常
    // void fun() throw(A, B, C, D);
    这里表示这个函数只会抛出bad_alloc的异常
    void* operator new (std::size_t size) throw (std::bad_alloc);

    // 这里表示这个函数不会抛出异常
    void* operator delete (std::size_t size, void* ptr) throw();
    void* operator delete (std::size_t size, void* ptr) noexcept;

    异常的优缺点总结:
    优点:
    1、清晰的包含错误信息
    2、面对T operator[](int i)这样函数越界错误,异常可以很好的解决
    3、多层调用时,里面发生错误,不再需要层层处理,最外层直接捕获即可
    4、很多第三方库都是用异常,我们也使用异常可以更好的使用他们。比如:boost、gtest、gmock
    缺点:
    1、异常会导致执行流乱跳。会给我调试分析程序bug带来一些困难。
    2、C++没有GC,异常可能到导致资源泄露等异常安全问题,需要学会使用RAII来解决。
    3、C++的库里面的异常体系定义不太好用,很多公司都会选择自己定义。
    4、C++的异常语言可以抛任意类型的异常,如果项目中没有做很好规范管理,那么会非常的混乱,所以一般需要定义出继承体系的异常规范。

    异常整体而言还是一个利大于弊的东西,所以实际日常练习或者小项目,不太使用,公司一般还是会选择异常来处理错误

    展开全文
  • xkcptun: c语言实现的kcptun,主要用于OpenWrt, LEDE开发的路由器项目上 et-frame: C#前后端框架(前端unity3d),统一用C#开发游戏,实现了前后端kcp协议 yasio: 一个跨平台专注于任意客户端程序的异步socket库, ...
  • 然后在你的浏览器中打开文件。看看这个页面你就知道你的PHP安装使用的选项了。 2.3 语法 就像前面提到的一样,你可以混合编写你的PHP代码和HTML代码。因此你必须办法将两者区别开来。以下就是你可以采用的几种...
  • 12.13 适用于整数和浮点数的数学函数分别有哪些? 12.14 什么是多字节字符(multibyte characters)? 12.15 怎样操作由多字节字符组成的字符串? 第13章 时间和日期 13.1 怎样把日期存储到单个数字中?有这...
  • C++程序员面试宝典

    热门讨论 2013-04-01 13:36:19
    面试题148 图的实现方式有哪几种 167 面试题149 如何进行图的搜索?搜索算法有哪几种方式 168 13.6 排序 169 面试题150 什么是冒泡排序 169 面试题151 鸡尾酒排序(改进的冒泡排序) 171 面试题152 什么是选择排序 ...
  • at ip time 程序名(或一个命令) /r 在某时间运行对方某程序并重新启动计算机 finger username @host 查看最近有哪些用户登陆 telnet ip 端口 远和登陆服务器,默认端口为23 open ip 连接到IP(属telnet登陆后的...
  • 读者将学习如何打开文件,以进行输入和输出,如何在文件中追加数据,如何使用二进制文件,如何获得 对文件的随机访问权。最后,还将学习如何使用标准的I/O方法来读取和写入字符串。 附录A:计数系统 本附录讨论...
  • 读者将学习如何打开文件,以进行输入和输出,如何在文件中追加数据,如何使用二进制文件,如何获得 对文件的随机访问权。最后,还将学习如何使用标准的I/O方法来读取和写入字符串。 附录A:计数系统 本附录讨论...
  • 读者将学习如何打开文件,以进行输入和输出,如何在文件中追加数据,如何使用二进制文件,如何获得 对文件的随机访问权。最后,还将学习如何使用标准的I/O方法来读取和写入字符串。 附录A:计数系统 本附录讨论...
  • 读者将学习如何打开文件,以进行输入和输出,如何在文件中追加数据,如何使用二进制文件,如何获得 对文件的随机访问权。最后,还将学习如何使用标准的I/O方法来读取和写入字符串。 附录A:计数系统 本附录讨论...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    这些设备名称的命名都是规则的,可以用“推理”的方式把设备名称找出来。例如,/dev/hda1这个 IDE设备,hd是Hard Disk(硬盘)的,sd是SCSI Device,fd是Floppy Device(或是Floppy Disk?)。a代表第一个设备,通常IDE...
  • 2-这时打开main.d查看,发现main.d中未加入pub.h,因为根据模式规则%.d: %.c中的定义,只有依赖的.c文件变了,才会重新生成.d,而刚才改的是command.h,不会重新生成main.d、及在main.d中加入对pub.h的依赖关系,这...
  • ATMEGA开发下载软件

    2012-07-04 19:13:17
    此时只有使用取下芯片使用并行编程方式,或使用JTAG方式(如果JTAG为允许时且目标板上留JTAG接口)来解救了。另一种解救的方式是:尝试在芯片的晶体引脚上临时人为的叠加上不同类型的振荡时钟信号,一旦ISP可以对...
  • iPhone开发秘籍(第2版)--源代码

    热门讨论 2012-12-11 13:51:22
    CruiseYoung提供的带详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 该资料是《iPhone开发秘籍:第2版》的源代码 对应的书籍资料见: iPhone开发秘籍:第2版(iphone开发必备佳作,在...
  • iPhone开发秘籍(第2版)--详细书签版

    热门讨论 2012-12-11 13:42:25
    CruiseYoung提供的带详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 iPhone开发秘籍:第2版(iphone开发必备佳作,在第一版的基础上进行了全面修订和大量扩充) 基本信息 原书名: ...
  • 第一,虽然第一版未曾涉及的进程间通信、文件系统等内容在许多书中都讲解,但阅读的时候还是感觉语焉不详的通病,作者本人可能很清楚原委,但写得太简略,以至于读者看来未必清晰。第二,我自己想把这个圈画圆。...
  • 第一,虽然第一版未曾涉及的进程间通信、文件系统等内容在许多书中都讲解,但阅读的时候还是感觉语焉不详的通病,作者本人可能很清楚原委,但写得太简略,以至于读者看来未必清晰。第二,我自己想把这个圈画圆。...
  • 第1章 预备知识 1.1 C++简介 1.2 C++简史 1.2.1 C语言 1.2.2 C语言编程原理 1.2.3 面向对象编程 ...17.4.3 打开多个文件 17.4.3 命令行处理技术 17.4.5 文件模式 17.4.6 随机存取 17.5 内核...
  • LINGO软件的学习

    2009-08-08 22:36:50
    一个派生集的成员列表两种方式生成:①显式罗列;②设置成员资格过滤器。当采用方式①时,必须显式罗列出所有要包含在派生集中的成员,并且罗列的每个成员必须属于稠密集。使用前面的例子,显式罗列派生集的成员:...

空空如也

空空如也

1 2
收藏数 35
精华内容 14
关键字:

c语言文件打开方式有哪些

c语言 订阅