1.格式化的输入和输出
printf 格式化字符串 %[flags][width][.prec][hlL]type
flags:
- : 左对齐
+ : 前面带正负号
0 : 0填充
space: 正数留空
number : 最小字符数
* : 下一个参数是字符数 //例如 printf("%*d",6,123) 输出 123(123前面有3空格)
.prec
.number : 小数点后的位数
.* : 下一个参数是小数点后的位数
hlL:
hh : 单个字节
h : short
l : long
ll : long long
L : long double
type:
注意 %n,后面要给一个参数num,表示将输出或者读入的个数写入num所在内存中
scanf: %[flag]type
flag:
type:
2.scanf和printf的返回值
scanf会返回读入的项目数
printf会返回输出的字符数(换行也算)
3.文件输入输出
linux terminal 中, ./执行文件a > 文件名b 表示将a程序的执行结果写入到b文件中
./执行文件a < 文件名b 表示将文件b中的数据作为输入,输入给程序a
4.程序中使用文件的相关函数
a. FILE* fp= fopen(const char* restrict path,const char* restrict mode); //打开文件,第一个是文件名,第二个是读写方式。fopen函数会返回NULL(如果要打开的文件不存在),或者该文件
FILE的本质:
FILE本质上是一个结构体,这个结构体中包含了文件相关的一些数据信息
if((fp=fopen("abc.txt","r"))==NULL)} printf("File open error! "); exit(0); //exit(0)是系统标准函数,作用是关闭所有打开的文件,并终止程序的执行 }
文件一旦打开,对该文件的操作方式就确定了。
c语言允许同时打开多个文件,但是同一个文件在关闭之前不能再次被打开。
b. int fclose(FILE *stream);
关闭文件,该函数返回一个整数,若返回值为0表示正常关闭文件,否则表示无法正常关闭文件。
if(fclose(fp)){ printf("Can not close the file "); exit(0); }
文件使用完之后应当关闭,因为c语言在向文件中写入东西的时候,实际上是把内容写到了一个文件缓冲区(内存)中,通常当文件缓冲区满了之后,操作系统会把缓冲区中的内容写到磁盘上,然后把缓冲区清零,但是最后写入缓冲区的内容不会被写到磁盘上去,而fclose函数可以保证把最后缓冲区中的内容写回磁盘。
此外,fclose函数还会释放掉文件缓冲区以及FILE结构体。
c.文件读函数
char fgetc(FILE* fp) //从fp所指向的文件中读出一个字符并返回,若读到文件末尾,则返回EOF
char *fgets(char *str,int n,FILE* fp) //str可以是字符数组名或字符指针,n是指定读入的字符的个数,fp是文件指针。实际最多只能读取n-1个字符,还有一个是‘ ’,当读取的时候达到指定字符个数、或遇到换行符,或到达文件末尾的EOF的时候,将会在读取的字符后面自动添加' ',其中换行符会被保留,EOF不会被保留。如果文件以及到达末尾(此时再使用fgets)或读取过程中发生异常,fgets会返回NULL。
fscanf(FILE* fp, 格式字符串(%d %s...可以有多个),输入表)
d. 文件写函数
int fputc(int ch,FILE* fp) //将ch的ASCII码对应的字符写入文件中,若写文件成功,则返回ch,否则返回EOF
fputs(const char *str,FILE* fp) //用来向指定的文本文件写入一个字符串,其中str可以是字符数组名,字符型指针变量或者字符串常量。其中字符串结尾的' '不会被写入文件,若函数执行成功,贼返回所写的最后一个字符/0/非负整数(不同编译器不同),否则返回EOF。
fprintf(FILE*,格式字符串,输出表)
e. fopen 的第二个参数见下图
5.二进制文件
其实所有的文件最终都是二进制的
二进制读写
size_t fread(void *restrict ptr,size_t size, size_t nitems,FILE *restrict stream); //返回值是成功读写的字节数
size_t fwrite(const void* restrict ptr,size_t size,size_t nitems,FILE *restrict stream); //二进制读写往往是对结构体读写,ptr表示开始读写数据的地址的指针,size表示结构体大小,nitems表示有几个这样的结构体,stream表示写到这个文件中去
在文件中定位
void rewind(FILE *stream) //将文件重新定位到文件头
long ftell(FILE *stream); //获取文件读写指针的当前位置,返回相对于文件头的位移量(字节数)
int feof(FILE* fp) //检测所指示文件是否到达了文件末尾,若是返回非0值,否则返回0
int fseek(FILE *stream,long offset,int whence); //stream为文件指针,offset为偏移量,如果使用常量,应该加L。函数执行成功返回0,否则返回 一个非零值
其中whence的可选值(对应的实值分别是0,1,2):
SEEK_SET : 从头开始
SEEK_CUR : 从当前位置开始
SEEK_END : 从末尾开始
例:fseek(fp,20L,0) //表示把文件指针移动到距离文件头部20字节处
6.位运算
C语言中的按运算符:
& 按位的与 //对应位为1时 结果为1
常用于取某一个数据中的一段或者一位
| 按位的或 //对应位有一个为1时 结果为1
常用于使得一位或几位为1、把两个数拼接起来
~ 按位取反 //每一位把1变0,0变1(注意和取补码不同)
^ 按位异或 //两个位相等,结果为0,不等结果为1.
A^B=C, C^B=A //同一个数异或两次值不变 //可以用B给A编码加密,解密时只需要用B再去异或一次就可以了
异或可以用来判断两个数是否相等,如果A,B相等,那么A^B=0
<< 左移 // i<<j 表示将i中的所有位向左移动j个位置,右边用0补齐 x<<=n 等价于x*=2^n
>> 右移 // i>>j 将i中所有位向右移动j个位置,左边用0补齐,但是符号位保持不变(如果是无符号类型,符号位不会保持不变) x>>=n 等价于 x/=2^n
注意 左移右移不要用负数