您的位置:首页 > 编程语言 > C语言/C++

小猪的C语言快速入门系列(八)

2017-10-17 16:32 267 查看

小猪的C语言快速入门系列(八)

标签: C语言

本节引言

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

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

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

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

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

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

本节学习路线图



位运算



Tips:

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

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

文件

1.文本文件的使用方式

读写字符作用
r只读方式打开一个文本文件,只允许度数据,不存在则打开失败
w只写方式打开或建立一个文本文件,只允许写数据
a追加的方式打开一个文本文件,可在文件尾写数据,不存在则创建一个
r+”读写方式打开一个文本文件,允许读写,不存在,打开失败
w+”读写方式打开或建立一个文本文件,允许读写
a+”读写方式打开文本文件,在文件末尾追加数据,不存在则创建一个

2.文件详细学习图



3.使用代码示例

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


#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("文件打开失败!\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'并不写入!
*/

#include <stdio.h>
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;
}


/*
fgets(字符串数组,n,文件指针)
就是:从fp执指向的文件中读取一个长度为n - 1的字符串,
存储在一维字符数组中,因为字符串会默认添加一个'\0'
*/

#include <stdio.h>
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 <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("文件打开失败!\n");
exit(1);
}
fprintf(fp,"%s%d %c%c",c,day,a,b);
fclose(fp);
return 0;
}


#include <stdio.h>
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 <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("文件打开失败!\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 <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("文件打开失败!\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

本文链接小猪的C语言快速入门系列(八)

作者:Coder-Pig

出处http://blog.csdn.net/coder_pig

本文基于知识共享署名-相同方式共享 4.0 国际许可协议发布,欢迎转载,

演绎或用于商业目的,但是必须保留本文的署名及链接。åç
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: