C语言快速入门系列八之位运算与文件

本节引言

本节讲解的是C语言中的位运算与文件,相信这两章对于部分童鞋来说是陌生的, 

因为很多大学的老师都会选择跳过这两个知识点,其实这两个知识点也是非常 

重要的,比如位运算,比如让你算a*2,怎么写效率(装逼)高,如果你会位运算 

你会 a<<1,效率可比a*2高哦,另外一个常见的问题,怎么不使用中间值 

变量交换两个变量的值?而文件操作的重要性也不用说吧,一般期末都会让你 

做一个xx管理系统之类的东东,存取文件基本是必不可少的!

本节学习路线图

位运算

小编推荐一个学C语言/C++的学习裙【 六二七,零一二,四六四 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

Tips:

位运算符并不改变自身的值,如果你想要改变自身的值,可以在运算符的后面 

加上等号: a &= b; 等价于 a = a & b;

文件

1.文本文件的使用方式

读写字符作用

r”只读方式打开一个文本文件,只允许度数据,不存在则打开失败

w”只写方式打开或建立一个文本文件,只允许写数据

a”追加的方式打开一个文本文件,可在文件尾写数据,不存在则创建一个

r+”读写方式打开一个文本文件,允许读写,不存在,打开失败

w+”读写方式打开或建立一个文本文件,允许读写

a+”读写方式打开文本文件,在文件末尾追加数据,不存在则创建一个

2.文件详细学习图

3.使用代码示例

单个字符写入(fputc())/读取(fgetc())

#include#include

int main() 

    FILE *fp; 

    char str[] = "Write The Data to File!"; 

    int index = 0; 

    fp = fopen("test1.txt","w"); 

    if(fp == NULL) 

    { 

        printf("文件打开失败!\n"); 

        exit(1); 

    } 

    //因为是一个个字符输入的,所以要获得长度 

    while(index < strlen(str)) 

      fputc(str[index++],fp); 

    fclose(fp); 

    return 0; 

}

#include "stdio.h" 

int main() 

    FILE *fp; 

    char c; 

    int n = 1; 

    if((fp = fopen("test1.txt","r")) == NULL) 

    { 

        printf("文件打开失败!\n"); 

        exit(1); 

    } 

    //EOF是文件结尾的标志,此处是判断是否到文件尾   

    while((c = fgetc(fp)) != EOF) 

    { 

        printf("%c",c); 

        n++; 

    } 

    printf("\n"); 

    fclose(fp); 

    return 0; 

}




运行结果

PS:如果不写完整路径的话,比如:d:\\c_code\\day 8的话,会在代码所在的 

目录下生成对应的文件。

读(fgets())写(fputs())一个字符串

/*

    fputs(字符串,fp)

    作用:向fp所指的文件中,将字符串写入,'\0'并不写入! 


/* fputs(字符串,fp) 作用:向fp所指的文件中,将字符串写入,'\0'并不写入! */ #include

int main() 

    char str[] = "通过fputs方法往文件中写入信息!"; 

    FILE *fp = fopen("test2.txt","w"); 

    if(fp == NULL) 

    { 

        printf("文件打开失败!\n"); 

        exit(1); 

    } 

    fputs(str,fp); 

    fclose(fp); 

    return 0; 

}


int main() 

    FILE *fp; 

    char str[20]; 

    if((fp = fopen("test2.txt","r")) == NULL) 

    { 

        printf("文件打开失败!\n"); 

        exit(1); 

    } 

    //这里写3是因为,汉字是占2个字节的 

    while(fgets(str,3,fp) != NULL) 

    printf("%s",str); 

    printf("\n"); 

    fclose(fp); 

    return 0; 

}



运行结果

格式化读(fprintf)写(fscanf)函数

这个和前面学的scanf和printf使用方法是一样的,不过前者们 

是针对内存中的数据的!而后者是针对文件读写的,fprintf是 

将控制台的内容打印到文件中,所以是写入fscanf则是将 

文件的内容输入到控制台,所以是读取


#include

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("文件打开失败!\n"); 

        exit(1);     

    } 

    fprintf(fp,"%s%d %c%c",c,day,a,b); 

    fclose(fp); 

    return 0; 

}


#include

int main() 

    //这里很容易出问题,所以我并不喜欢用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("文件打开失败!\n"); 

        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\n",c1,c2,c3,c4,c5,c6); 

    fclose(fp); 

    return 0; 

}


运行结果

二进制文件的读写

数据块方式写入(fwrite())与读取(fread())

代码示例

将学生信息存储到结构体中,然后通过fwrite()函数将结构体内容写入文件中; 

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


#include

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("文件打开失败!\n"); 

        exit(1);     

    } 

    //录入多个学生的信息: 

    while(1) 

    { 

        printf("请输入学号: ");scanf("%d",&stu.id); 

        printf("\n请输入姓名: ");scanf("%s",&stu.name); 

        printf("\n请输入年龄: ");scanf("%d",&stu.age); 

        //参数依次是: 数据起始地址,每次写入的数据块的字节数,数据块的数目,文件指针 

        fwrite(&stu,sizeof(stu),1,fp); 

        printf("\n继续输入?(Y/N)\n"); 

        getchar(); 

        c = getchar(); 

        if(c == 'y' || c == 'Y')continue; 

        else break; 

    } 

    fclose(fp); 

    return 0; 

}


#include

typedef struct 

    int id; 

    char name[20]; 

    int age; 

}STU; 

int main() 

    STU stu; 

    FILE *fp; 

    if((fp = fopen("test4.data","rb"))== NULL) 

    { 

        printf("文件打开失败!\n"); 

        exit(1);     

    } 

    //读取存储的学生信息 

    printf("输出文件中的内容:\n"); 

    printf("学生学号    学生姓名        学生年龄\n"); 

    //从fp指向的二进制文件读取数据,每次读取大小为size个字节的数据 

    //执行 1 次;最后将这些数据保存到结构体变量的地址内存中 

    //返回值正常时是读取的数据库个数(count)的值,否则返回0(错误或文件尾) 

    while(fread(&stu,sizeof(stu),1,fp) == 1) 

    { 

        printf("%-15d%-15s%-15d\n",stu.id,stu.name,stu.age); 

    } 

    fclose(fp); 

    return 0; 

}



输出结果



字写入(putw(n,fp))/读取(getw(fp))函数

getw与putw两个函数并不是ANSI C标准定义的函数,但很多C语言编译系统都有 

提供这两个函数,如果没有提供也可以自己写,这个用得不多,就不给出具体 

代码示例了,只给出函数的用法介绍。

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

二进制文件中! n为写入的整数,执行正常返回写入的整数,否则返回EOF

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容