7.1文件

7.2底层操作

7.1文件

格式化的输入输出

printf

%[flags][width][.prec][hIL]type

Flag  含义

-  左对齐

+  在前面放+或-

(space)  正数留空

0  0填充

 #include <stdio.h>

 void main()
{
printf("%+9d\n", ); printf("%9d\n", ); printf("%-9d\n", ); printf("%-+9d\n", ); printf("%09d\n", ); system("pause");
}

width或prec  含义

number  最小字符数

*  下一个参数是字符数

.number  小数点后的位数

.*  下一个参数是小数点后的位数

根据6指定的域宽输出123的值,并不输出6的值

printf("%*d\n", 6, 123);//上下一样

printf("%6d\n", 123);//上下一样

 #include <stdio.h>

 void main()
{
printf("%9.2f\n", 123.0); //根据6指定的域宽输出123的值,并不输出6的值 printf("%*d\n", , );//上下一样 printf("%6d\n", );//上下一样 system("pause");
}

类型修饰  含义

hh  单个字节

h  short

l  long

ll  long long

L  long double

 #include <stdio.h>
#include <stdlib.h> void main()
{
printf("%hhd\n", );//12345的十六进制是3039,取出39,39的十进制是57 printf("%hhd\n", (char)); printf("%9.2f\n", 123.0); system("pause");
}

type  用于

i或d  int

u  unsigned int

o  八进制

x  十六进制

X  字母大写的十六进制

f或F  float, 6

e或E  指数

g  float

G  float

a或A  十六进制浮点

c  char

s  字符串

P  指针

n  读入/写出的个数

scanf

%[flag]type

flag  含义

*  跳过

数字  最大字符数

hh  char

h  short

l  long double

ll  long long

L  long double

 #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> void main()
{
int num; scanf("%*d%d", &num);//跳过 printf("num=%d\n", num); system("pause");
}

type  用于

d  int

i  整数,可能为十六进制或八进制

u  unsigned int

o  八进制

x  十六进制

a,e,f,g  float

c  char

s  字符串(单词)

[...]  所允许的字符

P  指针

i  整数,可能为十六进制或八进制

 #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> void main()
{
int num; scanf("%i", &num); printf("num=%d\n", num); system("pause");
}

printf和scanf 的返回值

读入的项目数

输出的字符数

在要求严格的程序中,应该判断每次调用的scanf或printf的返回值,从而了解程序运行中是否存在问题

 #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> void main()
{
int num;
int i1 = scanf("%i", &num);//输入1234
int i2 = printf("%d\n", num); printf("%d;%d\n", i1, i2);//1;4,1代表读入了一个,5代表输出4个字符1234\n system("pause");
}

文件输入输出

用>和<做重定向

 #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> void main()
{
char path[] = "E:\\1.txt";//文件路径
FILE *fp = fopen(path, "a"); if (fp)
{
int num;
fscanf(fp, "%d", &num);//从文本文件中按格式输入
printf("%d\n", num);
fclose(fp);
}
else
{
printf("无法打开文件\n");
} system("pause");
}

fopen

r  打开只读

r+  打开读写,从文件头开始

w  打开只写,如果不存在则新建,如果存在则清空

w+  打开读写,如果不存在则新建,如果存在则清空

a  打开追加,如果不存在则新建,如果存在则从文件尾开始

..x  只新建,如果文件已存在则不能打开

二进制文件

其实所有的文件最终都是二进制的

文本文件无非是用最简单的方式可以读写的文件

more、tail

cat

vi

而二进制文件是需要专门的程序来读写的文件

文本文件的输入输出是格式化,可能经过转码

文本vs二进制

Unix喜欢用文本文件来做数据存储和程序配置

交互式终端的出现使得人们喜欢用文本和计算机"talk"

Unix的shell提供了一些读写文本的小程序

Windows喜欢用二进制

DOS是草根文化,并不继承和熟悉Unix文化

PC刚开始的时候能力有限,DOS的能力更有限,二进制更接近底层

文本的优势是方便人类读写,而且跨平台

文本的缺点是程序输入输出要经过格式化,开销大

二进制的缺点是人类读写困难,而且不跨平台

int的大小不一致,大小端的问题

二进制的优点是程序读写快

程序为什么要文件

配置

Unix用文本,Windows用注册表

数据

稍微有点量的数据都放数据库了

媒体

这个只能是二进制

现实是,程序通过第三方库读写文件,很少直接读写二进制文件了

二进制读写

fread和fwrite

在文件中定位

SEEK_SET;从头开始

SEEK_CUR;从当前位置开始

SEEK_END;从尾开始(倒过来)

可移植性

这样的二进制文件不具有可移植性

在int为32位的机器上写成的数据文件无法直接在int为64位的机器上正确读出

解决方案之一是放弃使用int,而是typedef具有明确大小的类型

更好的方案是用文本

7.2底层操作

C有这些按位运算的运算符:

&按位的与

|按位的或

~按位取反

^按位的异或

<<左移

>>右移

&按位的与

按位与常用于两种应用:
让某一位或某些位为0

取一个数中的一段

0101 1010

1000 1100 &

---------------

0000 1000

|按位的或

按位或常用于两种应用:
使得一位或几个位为1

把两个数拼起来

1010 1010

0101 0100 |

--------------

1111 1110

~按位取反

把1位变0,0位变1

想要得到全部位为1的数:~0

1010 1010 ~

---------------

0101 0101

 #include <stdio.h>
#include <stdlib.h> void main()
{
unsigned char c = 0xAA; printf("c=%hhx\n", c);
printf("~c=%hhx\n", (char)~c);//按位取反
printf("-c=%hhx\n", (char)-c);//补码 system("pause");
}

^按位的异或

如果两个位相等,那么结果为0;不相等,结果为1

如果x和y相等,那么x^y的结果为0

对一个变量用同一个值异或两次,等于什么也没做

x^y^y->x

1011 0100

0110 0011 ^

---------------

1101 0111

<<左移

i<<j

i中所有的位向左移动j个位置,而右边填入0

x<<=1等价于x*=2

x<<=n等价于x*=2^n

1010 0101 <<2

----------------------

10 1001 0100

 #include <stdio.h>
#include <stdlib.h> void main()
{
int a = 0x80000000;
unsigned int b = 0x80000000; printf("a=%d\n", a);
printf("b=%u\n", b); printf("a<<1=%d\n", a << );
printf("b<<1=%u\n", b << ); system("pause");
}

>>右移

i>>j

i中所有的位向右移动j位置

对于unsigned的类型,左边填入0

对于signed的类型,左边填入原来的最高位(保持符号不变)

x>>=1等价于x/=2

x>>=n等价于x/=2^n

 #include <stdio.h>
#include <stdlib.h> void main()
{
int a = 0x80000000;
unsigned int b = 0x80000000; printf("a=%d\n", a);
printf("b=%u\n", b); printf("a>>1=%d\n", a >> );
printf("b>>1=%u\n", b >> ); system("pause");
}

no zuo no die

移位的位数不要用负数,这是没有定义的行为

x << -2;//!!NO!!

逻辑运算vs按位运算

对于逻辑运算,它只看到两个值:0和1

可以认为逻辑运算相当于把所有的非0值都变成1,然后做按位运算

5&4->4而5&&4->1&1->1

5|4->5而5||4->1|1->1

-4->3而!4->!1->0

网易云课堂_C语言程序设计进阶_第七周:文件:文件访问、格式化输入输出、二进制输入输出的更多相关文章

  1. 网易云课堂_C语言程序设计进阶_第三周:结构:结构、类型定义、联合

    3.1 枚举 3.2 结构 3.3 类型定义 3.1 枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法来表明: enum 枚举类型名字{名字0,...,名字n}; 枚举类型名字通常并不 ...

  2. 网易云课堂_C语言程序设计进阶_第6周:程序结构

    6.1 全局变量 6.2 编译预处理 6.3 大程序结构 6.1 全局变量 全局变量 定义在函数外面的变量是全局变量 全局变量具有全局的生存期和作用域 它们与任何函数都无关 在任何函数内部都可以使用它 ...

  3. 网易云课堂_C语言程序设计进阶_第8周:图形交互程序

    8.2函数指针 8.2函数指针 #include <stdio.h> #include <stdlib.h> void f(int i) { printf("void ...

  4. 网易云课堂_C语言程序设计进阶_第5周:链表_1逆序输出的数列

    1 逆序输出的数列(10分) 题目内容: 你的程序会读入一系列的正整数,预先不知道正整数的数量,一旦读到-1,就表示输入结束.然后,按照和输入相反的顺序输出所读到的数字,不包括最后标识结束的-1. 输 ...

  5. 网易云课堂_C语言程序设计进阶_第5周:链表

    5.1可变数组 5.2链表 5.1可变数组 Resizable Array Think about a set of functions that provide a mechanism of res ...

  6. 网易云课堂_C语言程序设计进阶_期末考试编程题部分

    1 字符串循环右移(5分) 题目内容: 输入一个字符串和一个非负整数N,要求将字符串循环右移N次. 输入格式: 输入在第1行中给出一个字符串,以'#'表示结束,‘#’不是字符串的一部分,字符串的长度未 ...

  7. 网易云课堂_C语言程序设计进阶_第二周:指针:取地址运算和指针、使用指针、指针与数组、指针与函数、指针与const、指针运算、动态内存分配_2信号报告

    2 信号报告(5分) 题目内容: 无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength)    信号强度即大小. 其中R位于报告第一 ...

  8. 网易云课堂_C语言程序设计进阶_第一周:数据类型:整数类型、浮点类型、枚举类型_1计算分数精确值

    1 计算分数精确值(10分) 题目内容: 由于计算机内部表达方式的限制,浮点运算都有精度问题,为了得到高精度的计算结果,就需要自己设计实现方法. (0,1)之间的任何浮点数都可以表达为两个正整数的商, ...

  9. 网易云课堂_C语言程序设计进阶_第四周:ACL图形库

    创建ACLLib程序 #include"acllib.h" #include<stdio.h> int Setup1() { initWindow(, );//初始化窗 ...

随机推荐

  1. jupyter巨好玩-常用设置

    整理一下有用的设置: 自定义ipython工作目录 用jupyter notebook默认打开的页面时,默认在的是home路径,会看见一大堆东西,假如我们只想展示jupyter的工程目录咋办? 简单说 ...

  2. sql server 2008 索引

    微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引) 我们举例来 ...

  3. 5路数字量输入Di,5路大电流继电器输出,可电脑控制,支持modbus协议工业模块,支持和DCS,PLC无缝对接。

    数字量输入输出模块MRD-5060具有5路DI,5路继电器输出,1路485接口(支持Modbus RTU),能实现5路DI(干接点输入)转485的采集,也可以通过485控制5路继电器(5A30VDC, ...

  4. Congos

    http://hi.baidu.com/tag/cognos%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86/feeds http://www.blogjava.net/mlh ...

  5. 转自:Python函数式编程指南(二):函数

    2. 从函数开始 2.1. 定义一个函数 如下定义了一个求和函数: 1 2 def add(x, y):     return x + y 关于参数和返回值的语法细节可以参考其他文档,这里就略过了. ...

  6. MATLAB介绍

    MATLAB MATLAB[1]  是美国MathWorks公司出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink ...

  7. 一步一步实现AS3拖放组件

    外话: 我之前在天地会上发布过一个拖放组件,http://bbs.9ria.com/thread-117535-1-1.html 应该有人看过吧,那时候年纪轻轻,写了个东西,那时候基本能满足需求 但是 ...

  8. POJ 1135 Domino Effect (spfa + 枚举)- from lanshui_Yang

    Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...

  9. Dark roads(kruskal)

    Dark roads Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Su ...

  10. 发送通知:Notification

    Intent的主要功能是完成一个Activity跳转到其他Activity或者是Service的操作,表示的是一种 操作的意图. PendingIntent表示的是暂时执行的一种意图,是一种在产生某一 ...