zoukankan      html  css  js  c++  java
  • C语言高速入门系列(八)

    C语言高速入门系列(八)


    C语言位运算与文件


    本章引言:


    在不知不觉中我们的C高速入门系列已经慢慢地接近尾声了,而在这一节中,我们会对

    C语言中的位运算和文件进行解析,相信这两章对于一些人来说是陌生的,由于非常多

    老师都会跳过这两个大知识点,事实上这两个也是灰常重要的!比方一个问题,叫你算

    变量a乘以2,怎么写效率高?

    直接a *2,非常多人都这样写,可是假设你会位运算的话,你会a<<1;

    位运算的效率但是比a*2高的哦。还有一个问题,不用变量左中间值,直接交换两个变量的值?

    你怎么做?也是用到位运算!

    文件操作重要性就不用说啦!好了,请读者尾随笔者的脚步

    对C语言中的位运算与文件读写的核心知识点进行剖析吧~



    本节学习路线图:





    位运算:




    ps:位运算符并不改变变量自身的值,能够在运算符后加上等号:  a &= b  

    等同于a = a&b !




    文件:



    文本文件的使用方式:

    "r" 仅仅读方式打开一个文本文件,仅仅同意度数据,不存在则打开失败
    "w" 仅仅写方式打开或建立一个文本文件,仅仅同意写数据
    "a" 追加的方式打开一个文本文件,可在文件尾写数据,不存在则创建一个
    "r+" 读写方式打开一个文本文件,同意读写,不存在,打开失败
    "w+" 读写方式打开或建立一个文本文件,同意读写
    "a+" 读写方式打开文本文件,在文件末尾追加数据,不存在则创建一个

    ps:对于二进制文件,相应的仅仅要改成在每一个后面加上一个b就能够了:

    如: r --> rb      r+ = rb+


    文件具体学习图:





    使用代码演示样例:


    ①单个字符写入/读取

    写入: fputc()


    <span style="font-family:Microsoft YaHei;">#include <stdio.h>
    #include <string.h>
    int main()
    {
    	FILE *fp;
    	char str[] = "Write The Data to File!";
    	int index = 0;
    	fp = fopen("test1.txt","w");
    	if(fp == NULL)
    	{
    		printf("文件打开失败!
    ");
    		exit(1);
    	}
    	//由于是一个个字符输入的,所以要获得长度 
    	while(index < strlen(str))
    	  fputc(str[index++],fp);
    	fclose(fp);	
    	return 0;
    } </span>


    读取:fgetc()


    <span style="font-family:Microsoft YaHei;">#include "stdio.h"
    int main()
    {
    	FILE *fp;
    	char c;
    	int n = 1;
    	if((fp = fopen("test1.txt","r")) == NULL)
    	{
    		printf("文件打开失败!
    ");
    		exit(1); 
    	}
    	//EOF是文件结尾的标志,此处是推断是否到文件尾	
    	while((c = fgetc(fp)) != EOF)
    	{
    		printf("%c",c);
    		n++;
    	}
    	printf("
    ");
    	fclose(fp);
    	return 0;
    } </span>


    执行截图:




    ps:假设不写完整路径的话,比方:d:\c_code\day 8的话,会在代码所在的文件夹下生成相应的文本文件!




    ②读写一个字符串:

    写入fputs()


    <span style="font-family:Microsoft YaHei;">/*
    	fputs(字符串,fp)
    	作用:向fp所指的文件里,将字符串写入,''并不写入! 
    */
    
    #include <stdio.h>
    int main()
    {
    	char str[] = "通过fputs方法往文件里写入信息!";
    	FILE *fp = fopen("test2.txt","w");
    	if(fp == NULL)
    	{
    	    printf("文件打开失败!
    ");
    		exit(1);
    		
    	}
    	fputs(str,fp);
    	fclose(fp);
    	return 0;
    }</span>


    读取:fgets()


    <span style="font-family:Microsoft YaHei;">/*
    	 fgets(字符串数组,n,文件指针)
    	 就是:从fp执指向的文件里读取一个长度为n - 1的字符串,
    	 存储在一维字符数组中 ,由于字符串会默认加入一个'' 
    */
    
    
    #include <stdio.h>
    int main()
    {
    	FILE *fp;
    	char str[20];
    	if((fp = fopen("test2.txt","r")) == NULL)
    	{
    		printf("文件打开失败!
    ");
    		exit(1);
    	}
    	//这里写3是由于,汉字是占2个字节的 
    	while(fgets(str,3,fp) != NULL)
    	printf("%s",str);
    	printf("
    ");
    	fclose(fp);
    	return 0;
    }</span>


    执行截图:




    ③格式化读写函数


    这个和之前学的scanf()和printf()用法一样,可是,前者是针对内存中的数据的;

    而fscanf(0和fprintf()则相应文件读写的!


    ps:要注意哦!fprintf是将控制台的内容打印到文件里哦。所以是写入

    fscanf()是将文件里的内容输入到控制台哦! 所以是读取


    写入fprint:


    <span style="font-family:Microsoft YaHei;">#include <stdio.h>
    int main()
    {
    	char c[] = "Today is 2014 July ";
    	int day = 22;
    	char a = 't',b = 'h';
    	FILE *fp;
    	if((fp = fopen("test3.txt","w"))== NULL)
    	{
    	    printf("文件打开失败!
    ");
    		exit(1);	
    	}
    	fprintf(fp,"%s%d %c%c",c,day,a,b);
    	fclose(fp);
    	return 0;
    }</span>



    读取fscanf()


    <span style="font-family:Microsoft YaHei;">#include <stdio.h>
    int main()
    {
    	//这里非常easy出问题,所以我并不喜欢用fscanf这个函数 
    	char c1[5],c2[5],c3[5],c4[5],c5[5],c6[5];
    	int day,year;
    	FILE *fp;
    	if((fp = fopen("test3.txt","r"))== NULL)
    	{
    	    printf("文件打开失败!
    ");
    		exit(1);	
    	}
    	//这个要依照读取的文件的格式写,我弄了N久还是不行
    	//就直接用6个字符串了... 
    	fscanf(fp,"%s%s%s%s%s%s",&c1,&c2,&c3,&c4,&c5,&c6);
    	printf("%s %s %s %s %s %s
    ",c1,c2,c3,c4,c5,c6);
    	fclose(fp);
    	return 0;
    }</span>


    执行截图:






    二进制文件的读写


    演示样例代码:将学生信息存储到结构体中,然后通过fwrite()函数将结构体内容写入文件里;

    在通过fread()函数读取出来



    ①数据块方式写入:

    演示样例代码:

    <span style="font-family:Microsoft YaHei;">#include <stdio.h>
    
    typedef struct
    {
    	int id;
    	char name[20];
    	int age;
    }STU;
    
    int main()
    {
    	STU stu;
    	FILE *fp;
    	char c;
    	//内容是追加的! 
    	if((fp = fopen("test4.data","ab"))== NULL)
    	{
    	    printf("文件打开失败!
    ");
    		exit(1);	
    	}
    	//录入多个学生的信息:
    	while(1)
    	{
    		printf("请输入学号: ");scanf("%d",&stu.id);
    		printf("
    请输入姓名: ");scanf("%s",&stu.name);
    		printf("
    请输入年龄: ");scanf("%d",&stu.age);
    		//參数依次是: 数据起始地址,每次写入的数据块的字节数,数据块的数目,文件指针 
    		fwrite(&stu,sizeof(stu),1,fp);
    		printf("
    继续输入?(Y/N)
    ");
    		getchar();
    		c = getchar();
    		if(c == 'y' || c == 'Y')continue;
    		else break;
    	} 
    	fclose(fp);
    	return 0;
    }</span>

    执行截图:

               


    ②数据块方式读取:

    演示样例代码:

    <span style="font-family:Microsoft YaHei;">#include <stdio.h>
    
    typedef struct
    {
    	int id;
    	char name[20];
    	int age;
    }STU;
    
    int main()
    {
    	STU stu;
    	FILE *fp;
    	if((fp = fopen("test4.data","rb"))== NULL)
    	{
    	    printf("文件打开失败!
    ");
    		exit(1);	
    	}
    	//读取存储的学生信息 
    	printf("输出文件里的内容:
    ");
    	printf("学生学号     学生姓名        学生年龄
    ");
    	//从fp指向的二进制文件读取数据,每次读取大小为size个字节的数据
    	//运行 1 次。最后将这些数据保存到结构体变量的地址内存中
    	//返回值正常时是读取的数据库个数(count)的值,否则返回0(错误或文件尾) 
    	while(fread(&stu,sizeof(stu),1,fp) == 1)
    	{
    		printf("%-15d%-15s%-15d
    ",stu.id,stu.name,stu.age);
    	}
    	fclose(fp);
    	return 0;
    }</span>



    ②字输入/输出函数

    getw和putw两个函数并非ANSI C标准定义的函数,但非常多的C语言编译系统都提供这两个函数,

    假设没提供也能够自己写,这个用的不多,就不给出代码演示样例了,仅仅给出函数使用方法:

    putw(n,fp):以二进制的形式将一个int类型的数据写入到fp所指向的二进制文件里! 

      n为写入的整数,运行正常返回写入的整数,否则返回EOF

    getw(fp):从fp指向的二进制文件里以二进制的方式读取一个字

                     运行正常返回所读取的二进制整数,否则返回EOF





    本章小结:

    ①位运算:

    1.什么是位运算,位运算的6个运算符的作用

    2.位运算的使用,原码,补码与反码的概念

    3.位运算的相关应用(取代乘法运算,不使用中间变量等)


    ②文件

    1.为什么要用文件?

    文件的分类

    2.文件类型指针 FILE *fp;

    3.文件打开关闭:  fopen()打开    fclose()关闭

    4.文件的读写操作  1)字符读写:fgetc 和 fputc                      2)字符串读写:fgets 和 fputs

                                      3)格式化读写:fscanf 和 fprintf              4)数据块读写:fwrite 和 fread

              5)字读写(整数) getw和putw

    5.文件定位:   rewind(fp) 移动指针到文件头                  fseek()将指针移动到某个地方

                           ftell(fp)  返回指针的相对位移量


    6.文件状态检查函数:feof(fp)文件是否结束                   ferror(fp)运行输入输出时文件是否出错,返回0表示没出错

        clearerr(fp):又一次设置文件出错标志,无返回值







  • 相关阅读:
    Siege 3.0 正式版发布,压力测试工具
    Pomm 1.1.2 发布,专为 PG 设计的 ORM 框架
    Whonix 0.5.6 发布,匿名通用操作系统
    国内开源 java cms,Jspxcms 2.0 发布
    EZNamespaceExtensions.Net v2013增加对上下文菜单、缩略图、图标、属性表的支持
    GNU Guile 2.0.9 发布,Scheme 实现
    jdao 1.0.4 发布 轻量级的orm工具包
    OpenSearchServer 1.4 RC4 发布
    Percona Server for MySQL 5.5.3030.2
    Samba 4.0.5 发布
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6729328.html
Copyright © 2011-2022 走看看