C语言学习笔记1

---摘要:C语言学习个人向记录-输入输出验证---

# 2021/3/5 输入输出--通用I/O函数

单字符I/O

缓冲区

缓冲输入–缓冲区–使用

无缓冲输入–直接使用

UNIX和IBM等使用无缓冲的方法不一样,还是常用缓冲

结束键盘输入

文件、流和键盘输入

file在各个系统不一致

low-level I/O不好用,没必要搞标准库

standard I/O package 最终用这个统一的

不一致性:

有些系统吧文件信息放一边,文件放另一边

有些系统用换行符换行,有些用回车+换行

stream 流,数据流,没看懂

目前的理解,屏幕输出是程序运行的“副产物”,键盘输入是文件写入

既然键盘输入是文件写入,那么一定能结束文件

文件结尾

getchar()这个函数,是识别输入-1为结尾的

char类型没有-1,无所谓

但是getchar实际上会出int类型的值

EOF是内定文件结尾

1
2
int ch;
while((ch=getchar())!=EOF)

重定向和文件

不止可以用键盘输入,什么磁带,穿孔卡片,语音都可以

更多的,从其它文件

打开,读取,写入,关闭文件

也可以重新定向

20210305173439

成功了,程序+空格+<+空格+文件名就行

20210305173751

OMG,我居然用程序创造了一个文件

似乎在使用电脑的历史中我总是用别人的程序创造文件

所以自己写的程序创造了一个文件感觉很特别

20210305174217

利用组合重定向复制一个文件

定向输入和输出的顺序无关紧要

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
#include<stdbool.h>
int main(void)
{
int ch;
while ((ch=getchar())!=EOF)
{
putchar(ch);
}
return 0;
}

好家伙,用代码替代刚才那些操作就要用到新的函数了

  • fopen()

新的类型 FILE * fp

fp=fopen(filename,”r”);

文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:

r(read): 只读

w(write): 只写

a(append): 追加

t(text): 文本文件,可省略不写

b(binary): 二进制文件

+: 读和写

代码,逐字复制一个文本文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int ch;
FILE * fp;
char fname[50];
printf("Enter the name of the file:");
scanf("%s",fname);
fp=fopen(fname,"r");
if(fp==NULL){
printf("no\n");
//exit(1);
}
//从打开文件弄个字符用函数getc()
while((ch=getc(fp))!=EOF)
{
putchar(ch);
}
fclose(fp);
return 0;
}

更友好的输入

有一个很诡异的事儿

就是输入的东西会进一个缓冲队列

读一个字符,后面的字符还在队列里

比如说,你用键盘输入一个1+Enter

实际上’1’+’\n’都被存入,你就相当于输入两个字符

1
2
3
//基本上你需要在循环里加上这个,跳过其他输入
while(getchar()!='\n')
continue;

注意getchar()和scanf()的区别

scanf用来读数值,会跳过换行符,空格和制表符

  • 跳过输入中不需要的部分
1
2
3
4
5
6
7
8
char get_first(void)
{
int ch;
ch=getchar();
while(getchar()!='\n')
continue;
return ch;
}

关于输入界面的内容,可以总结到这个程序当中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/* menuette.c ---菜单程序 */
#include<stdio.h>
char get_char(void);
char get_first(void);
void count(void);
int get_int(void);

int main(void){
int choice;
while ((choice=get_char())!='q')
{
switch (choice)
{
case 'a':
printf("高买低卖\n");
break;
case 'b':
putchar('\a');//ANSI
break;
case 'c':count();
break;
default:printf("Program error!\n");
break;
}
}
printf("Bye.\n");
return 0;
}
char get_char(void)
{
int ch;
printf("Enter the letter of your choice:\n");
printf("a.advice b.bell\n");
printf("c.count q.quit\n");
ch=get_first();
while((ch<'a'||ch>'c')&&ch!='q')
{
printf("输入a,b,c或者q退出,别瞎搞\n");
ch=get_first();
}
return ch;
}

char get_first(void)
{
int ch;
ch=getchar();
while(getchar()!='\n')
continue;
return ch;
}

void count(void)
{
int n,i;
printf("输入一个整数,然后报数\n");
n=get_int();
for(i=0;i<n;i++)
{
printf("%d\n",i);
}
while(getchar()!='\n')
continue;
}

int get_int(void)
{
int input;
char ch;
while((scanf("%d",&input))!=1)
{
while((ch=getchar())!='\n')
{
putchar(ch);
}
printf("不是一个整数\n");
printf("整数什么样不知道,12,342,3这种:\n");
}
return input;
}