Ⅰ c语言中,再对文件的操作模式中,a和a+、w和w+、r和r+有什么区别
r 打开只读文件,该文件必须存在。r+ 打开可读写的文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
Ⅱ C语言文件中,“rb”和“r”有什么区别
一、作用不同
1、rb:代表二进制文件,用来读写二进制文件。
2、r:代表文本文件,用来读写文本文件。
二、特点不同
1、rb:文件编码是变长的,灵活利用率要高,而译码要难一些,不同的二进制文件译码方式是不同的。
2、r:是一种典型的顺序文件,其文件的逻辑结构又属于流式文件。
三、优劣不同
1、rb:二进制文件比较节约空间,这两者储存字符型数据时并没有差别。但是在储存数字,特别是实型数字时,二进制更节省空间。
2、r:文本文件存在于计算机系统中,通常在文本文件最后一行放置文件结束标志。文本文件的编码基于字符定长,译码相对要容易一些。
Ⅲ C语言中\r与\b 输出结果的怎么一样的
是这样的,
\r是回车,表示把输入光标移到本行开头。
\n是换行,租段做表示把输入燃数光标移到下一行。
\b表示退格,删除前一个字符
所以那个e不是被删除了,而是被Press any key to continue给覆盖了
printf("%c\n%c\n%c\r\n",c,d,t);这样就能输出t了
ps:一般我们按得弊衡回车键是两个字符:回车+换行(ASCII码13,10)
Ⅳ C语言中,编程用到r w rb wb r+等的时候怎么分辨是用r呢还是用rb,怎么区分是二
文件打开方式
r-read读
w-write写
a-在文件末尾追加数据
b-bite二进制文件
t-text文本文件
r+读写
w+写读
其他的只要把这些组合在一起就行了
好比rt rb wt wb rb+
而如at+可以这样记 a-在文件末尾追加数据 +(写的反面是读)
所以at+表示 打开一个文本文件,允许读或者在文件末尾追加数据
Ⅳ C语言中\b和\r都怎么用
\r表示回车森伍高此尺
\b表示空格
用于printf函数。
比如
printf("测试内容\r\b");输出结果就会出现橘态空格和回车
Ⅵ C语言中 freopen("b.txt","r",stdin);是用来干嘛的啊为什么有的地方是“r”,有的是“w”!!
函数名: freopen
功 能: 替换一个流,或者说重新分配文件指针,实现重定向。
用 法: FILE *freopen(char *filename, char *type, FILE *stream);
是文件流的东西
参数灶悉1:filename 为文件名,就是你要为stream该指针定义袜尘的新文件
参数2:告辩禅*type为指针类型,最基本的有r只读(文件不存在则返回NULL),w只写(不存在则自动新建,存在会清空源文件),a追加(存在则会指向添加到源文件的最后面,不存在返回NULL).
参数3:则为文件指针,就是之前定义过的指针修改为新的指针用的。
Ⅶ c语言中wb,rb是什么意思
wb代表二进制模式文件,允许写入文件,rb代表二进制模式,允许读取文件。
形态字符串都可以再加一个 b 字符,如 rb、w+b 或 ab+ 等组合,加入 b 字符用来告诉函数库以二进制模式打开文件。
如果不加 b,表示默认加了 t,即 rt、wt,其中 t 表示以文本模式打开文件。由 fopen() 所建立的新文件会具有 S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666) 权限,此文件权限也会参考umask值。
(7)c语言中b和r都怎么用啊扩展阅读
C语言之文件打开模式
r : 读取文件,若文件不存在则会报错
w: 写入文件,若文件不存在则会先创建再写入,会覆盖原文件
a : 写入文件,若文件不存在则会先创建再写入,但不会覆盖原文件,而是追加在文件末尾
rb,wb:分别于r,w类似,但是用于读写二进制文件
r+ : 可读、可写,文件不存在也会报错,写操作时会覆盖
w+ : 可读,可写,文件不存在先创建,会覆盖
a+ :可读、可写,文件不存在先创建,不会覆盖,追加在末尾
Ⅷ C语言的转义字符/r到底是怎么用的
\r作用是将光标移动到行首,接下来输出的字符将覆盖行首的字符。
\n的作用才是将光标移动到下一行。
Ⅸ c语言中 \t \b \n \r , \后面的t b n r 分别是什么英文的缩写b是back吗
TAB制表符
BACKSPACE退格符
NewLine换行符(本意:换一个新行,但列位置不变)
Return回车符(本意:行位置不变,将列位置切换到本行首)
不过现在 含义与本意有些变化了,在linux下, 的含义等于window下的
===========================================================
下面说nextline的兄弟,不知道是自己胡诌的,还是老师教错了。完整的列表给大家写一下:
十进制编码 (对应)缩写字符(或功能/解释)
0 NUL(null) 空字符
1 SOH(start of headline) 标题开始
2 STX (start of text) 正文开始
3 ETX(end of text) 正文结束
4 EOT (end of transmission) 传输结束
5 ENQ (enquiry) 请求
6 ACK (acknowledge) 收到通知
7 BEL (bell) 响铃
8 BS (backspace) 退格
9 HT (horizontal tab) 水平制表符
10 LF (NL line feed, new line) 换行键
11 VT (vertical tab) 垂直制表符
12 FF (NP form feed, new page) 换页键
13 CR (carriage return) 回车键
14 SO (shift out) 不用切换
15 SI (shift in) 启用切换
16 DLE (data link escape) 数据链路转义
17 DC1 (device control 1) 设备控制1
18 DC2 (device control 2) 设备控制2
19 DC3 (device control 3) 设备控制3
20 DC4 (device control 4) 设备控制4
21 NAK (negative acknowledge) 拒绝接收
22 SYN (synchronous idle) 同步空闲
23 ETB (end of trans. block) 传输块结束
24 CAN (cancel) 取消
25 EM (end of medium) 介质中断
26 SUB (substitute) 替补
27 ESC (escape) 换码(溢出)
28 FS (file separator) 文件分割符
29 GS (group separator) 分组符
30 RS (record separator) 记录分离符
31 US (unit separator) 单元分隔符
Ⅹ C语言中\r的用法
bioskey(1)检测是否有键按下,没有键按下时返回0,有键按下时返回按键码(任何按键码都不为0),但此时并不将检测到的按键码从键盘缓冲队列中清除.
bioskey(0)返回键盘缓冲队列中的按键码,并将此按键码从键盘缓冲队列中清除.
bioskey(2)返回按键的状态(如组合键等),返回的整数中的每一个位含义如下:
┌——┬———————————┬———————————┐
│ 位 |为0时意义 │为1时意义 │
├——┼———————————┼———————————┤
│ 7 │插入状态 │改写状态 │
│ 6 │大写状态 │小写状态 │
│ 5 │数字状态,NumLock灯亮│光标状态,NumLock灯熄 │
│ 4 │ScrollLock灯亮 │ScrollLock灯熄 │
│ 3 │Alt按下 │Alt未按下 │
│ 2 │Ctrl按下 │Ctrl未按下 │
│ 1 │左Shift按下 │左Shift未按下 │
│ 0 │右Shift按下 │右Shift未按下 │
└——┴———————————┴———————————┘
这些都是从 C函数速查 中找的,大家可以从网上搜一下.bioskey()是返回键盘状态的基本函数,它拥有3个参数
函数原型为:
int bioskey(int cmd)
其中cmd有3个参数:0,1,2
各参数的用法为:
当cmd是0,bioskey()返回下一个在键盘键入的值(它将等待到按下一个键)。它返回一个16位的二进制数,包括两个不同的值。当按下一个普通键时,它的低8位数存放该字符的ASCII码;对于特殊键(如方向键、F1~F12等等),低8位为0,高8位字节存放该键的扫描码。
cmd = 1:
当cmd是1,bioskey()查询是否按下一个键,若按下一个键则返回非零值,否则返回0。
cmd = 2:
当cmd是2,bioskey()返回Shift、Ctrl、Alt、ScrollLock、NumLock、CapsLock、Insert键的状态。各键状态存放在返回值的低8位字节中。
字节位 含义
0 右边Shift键状态
1 左边Shift键状态
3 Ctrl键状态
4 Alt键状态
5 ScrollLock键状态
6 NumLock键状态
7 CapsLock键状态
8 Insert键状态bioskey函数
函数原型: int bioskey(int cmd);
函数功能:
利用函数bioskey可以实现三种功能,参数cmd为要实现的功能号,值只能为0、1、2,具
体含义如下:
0:在系统中有一个按键队列,所有的键盘按键都在这里排成队。该功能就是如果按键队
列中有按键,那么读取队列首位的按键,并返回按键值;否则等待键盘按键出现。(其
中按键值的高字节为扫描码,低字节为ASCII码)
1:如果按键队列中没有按键,那么返回零,否则返回非零。
2:返回特殊按键Shift、Ctrl、Alt等键的按键状态
bioskey函数用于从内存中读取一个按键的scancode值.
格式是: int bioskey(int cmd)
参数cmd取值:
0: 读取scancode,并从内存中删除,如果没有按键则等待.
1: 读取scancode,但不从内存中删除(其它函数可以继续使用),如果无按键则返回0
2: 返加shift alt ctrl键的状态
按下shift返回1,按下ctrl返回4,按下alt返回8,
如果是 shift+ctrl 则返回5(相加),依此类推....下面是一个例子:
#include <bios.h>
main()
{
while(!kbhit())
{
printf("\n%d,%d",bioskey(0),bioskey(2));
}
}
注意:这是一个死循环,因为参数0表示接收按键码,但将其清除,所以kbhit()函数就接收不到按键了.
可按ctrl+break组合键来终止这个程序.然后将 bioskey(0)改为 bioskey(1),
如果不按键将显示0,若按键则立即结束
函数名: bioskey
功 能: 直接使用BIOS服务的键盘接口
函数原型:int bioskey (int cmd)
说明:bioskey()的函数原型在bios.h中
bioskey()完成直接键盘操作,cmd的值决定执行什么操作。
cmd = 0:
当cmd是0,bioskey()返回下一个在键盘键入的值(它将等待到按下一个键)。它返回一个16位的二进制数,包括两个不同的值。当按下一个普通键时,它的低8位数存放该字符的ASCII码;对于特殊键(如方向键、F1~F12等等),低8位为0,高8位字节存放该键的扫描码。
cmd = 1:
当cmd是1,bioskey()查询是否按下一个键,若按下一个键则返回非零值,否则返回0。
cmd = 2:
当cmd是2,bioskey()返回Shift、Ctrl、Alt、ScrollLock、NumLock、CapsLock、Insert键的状态。各键状态存放在返回值的低8位字节中。
字节位 含义
0 右边Shift键状态
1 左边Shift键状态
3 Ctrl键状态
4 Alt键状态
5 ScrollLock键状态
6 NumLock键状态
7 CapsLock键状态
8 Insert键状态
字节位为1表示该键被按下,为0表示松开。
程序例:
#include <stdio.h>
#include <bios.h>
#include <ctype.h>
#define RIGHT 0x01
#define LEFT 0x02
#define CTRL 0x04
#define ALT 0x08
int main(void)
{
int key, modifiers;
/* function 1 returns 0 until a key is pressed */
while (bioskey(1) == 0);
/* function 0 returns the key that is waiting */
key = bioskey(0);
/* use function 2 to determine if shift keys were used */
modifiers = bioskey(2);
if (modifiers)
{
printf("[");
if (modifiers & RIGHT) printf("RIGHT");
if (modifiers & LEFT) printf("LEFT");
if (modifiers & CTRL) printf("CTRL");
if (modifiers & ALT) printf("ALT");
printf("]");
}
/* print out the character read */
if (isalnum(key & 0xFF))
printf("'%c'\n", key);
else
printf("%#02x\n", key);
return 0;
}
bioskey 返回的值有两种情况。
就 ASCII 而言:按一个按键会有两种情况发生。
1.按一个按键,产生一个ASCII,这样 bioskey 返回的值就是:hi:扫描码,lo:ASCII
2.按一个按键,产生两个ASCII,一个是0,另一个是每个键不同的ASCII, bioskey 的返回值就是:hi:ASCII, lo:0
有很多键没有ASCII,例如Shift, Ctrl, CapsLock 等,但是他们有扫描码,只要是按键就有扫描码。
扫描码和ASCII是完全不同的两个概念,是硬件识别键盘的编码,每个按键都有固定的扫描码,用来区别每个按键,不同的按键的扫描码都不同。
两个按键的ASCII有可能相同,但是扫描码一定不同,只要是两个键,扫描码就不同,例如两个回车,ASCII相同,但是扫描码不同。
我以前的程序编过一段扫描码,贴出来给你看看:(7年前编的,本来是我当时想做的一个游戏引擎的一段程序,可以判断和处理键盘上任意多个键同时按下/抬起的情况,可惜因种种原因中断了,因DOS程序,现在也没什么意义了)
扫描码的D7位为0,表示这个按键被按下产生的中断,D7为1表示这个按键被抬起产生的中断。
//特殊按键
//Pause = 0xe145 / 0xe1c5 (0xe1,0x1d(Ctrl),0x45(NumLock) - 0xe1,0x9d,0xc5)
//Break = 0xe046 / 0xe0c6 (0xe0, ScrollLock)
//PrtSc = 0xe037 / 0xe0b7 (0xe0, KeyPad - *)
//SysRq = Ctrl - PrtSc
char PauseKeyName=
{
"NULL", //00
"Esc", //01
"1 !", //02
"2 @", //03
"3 #", //04
"4 $", //05
"5 %", //06
"6 ^", //07
"7 &", //08
"8 *", //09
"9 (", //0A
"0 )", //0B
"- _", //0C
"+ =", //0D
"BackSpace", //0E
"Tab", //0F
"Q", //10
"W", //11
"E", //12
"R", //13
"T", //14
"Y", //15
"U", //16
"I", //17
"O", //18
"P", //19
" }", //1B
"Enter", //1C
"L-Ctrl", //1D
"A", //1E
"S", //1F
"D", //20
"F", //21
"G", //22
"H", //23
"J", //24
"K", //25
"L", //26
"; :", //27
"" \"", //28
"` ~", //29
"L-Shift", //2A
"\\ |", //2B
"Z", //2C
"X", //2D
"C", //2E
"V", //2F
"B", //30
"N", //31
"M", //32
", <", //33
". >", //34
"/ ?", //35
"R-Shift", //36
" *", //37
"L-Alt", //38
"Space", //39
"CapsLock", //3A
"F1", //3B
"F2", //3C
"F3", //3D
"F4", //3E
"F5", //3F
"F6", //40
"F7", //41
"F8", //42
"F9", //43
"F10", //44
"NumLock", //45
"ScrollLock",//46
" 7 Home", //47
" 8 Up", //48
" 9 PgUp", //49
" -", //4A
" 4 Left", //4B
" 5", //4C
" 6 Right", //4D
" +", //4E
" 1 End", //4F
" 2 Down", //50
" 3 PgDn", //51
" 0 Ins", //52
" . Del", //53
"PrtSc(Alt)",//54
"??? 55H", //55
"Added \\ |",//56
"F11", //57
"F12", //58
"??? 59H", //59
"??? 5AH", //5A
"??? 5BH", //5B
"??? 5CH", //5C
"??? 5DH", //5D
"??? 5EH", //5E
"??? 5FH", //5F
"??? 60H", //60
"??? 61H", //61
"??? 62H", //62
"??? 63H", //63
};
char KeyNamesE0=
{
"NULL", //E000
"??? E001H", //E001
"??? E002H", //E002
"??? E003H", //E003
"??? E004H", //E004
"??? E005H", //E005
"??? E006H", //E006
"??? E007H", //E007
"??? E008H", //E008
"??? E009H", //E009
"??? E00AH", //E00A
"??? E00BH", //E00B
"??? E00CH", //E00C
"??? E00DH", //E00D
"??? E00EH", //E00E
"??? E00FH", //E00F
"??? E010H", //E010
"??? E011H", //E011
"??? E012H", //E012
"??? E013H", //E013
"??? E014H", //E014
"??? E015H", //E015
"??? E016H", //E016
"??? E017H", //E017
"??? E018H", //E018
"??? E019H", //E019
"??? E01AH", //E01A
"??? E01BH", //E01B
" Enter", //E01C
"R-Ctrl", //E01D
"??? E01EH", //E01E
"??? E01FH", //E01F
"??? E020H", //E020
"??? E021H", //E021
"??? E022H", //E022
"??? E023H", //E023
"??? E024H", //E024
"??? E025H", //E025
"??? E026H", //E026
"??? E027H", //E027
"??? E028H", //E028
"??? E029H", //E029
"??? E02AH", //E02A
"??? E02BH", //E02B
"??? E02CH", //E02C
"??? E02DH", //E02D
"??? E02EH", //E02E
"??? E02FH", //E02F
"??? E030H", //E030
"??? E031H", //E031
"??? E032H", //E032
"??? E033H", //E033
"??? E034H", //E034
" /", //E035
"??? E036H", //E036
"PrtSc", //E037
"R-Alt", //E038
"??? E039H", //E039
"??? E03AH", //E03A
"??? E03BH", //E03B
"??? E03CH", //E03C
"??? E03DH", //E03D
"??? E03EH", //E03E
"??? E03FH", //E03F
"??? E040H", //E040
"??? E041H", //E041
"??? E042H", //E042
"??? E043H", //E043
"??? E044H", //E044
"??? E045H", //E045
"Break", //E046
"Home", //E047
"Up", //E048
"PageUp", //E049
"??? E04AH", //E04A
"Left", //E04B
"??? E04CH", //E04C
"Right", //E04D
"??? E04EH", //E04E
"End", //E04F
"Down", //E050
"PageDown", //E051
"Insert", //E052
"Delete", //E053
"??? E054H", //E054
"??? E055H", //E055
"??? E056H", //E056
"??? E057H", //E057
"??? E058H", //E058
"??? E059H", //E059
"??? E05AH", //E05A
"L-Start95", //E05B
"R-Start95", //E05C
"Menu95", //E05D
"Power", //E05E
"Sleep", //E05F
"??? E060", //E060
"??? E061", //E061
"??? E062", //E062
"Wake Up", //E063
};
得到扫描码的方法:拦截键盘硬体中断,计算的结果保存在 KeyScanCode 里,KeyboardProc();就是处理这个值的函数。
unsigned far *_Key_Flags = (unsigned far *)0x00000417L;
unsigned far *_Key_Flags1= (unsigned far *)0x00000496L;
unsigned int far KeyScanCode = 0;
unsigned char far KeyScBuffer=;
unsigned char far KeyTempChar = 0;
void interrupt NewKb09(...)
{
asm cli
KeyTempChar=inportb(0x60);
KeyScBuffer=KeyScBuffer;
KeyScBuffer=KeyScBuffer;
KeyScBuffer=KeyScBuffer;
KeyScBuffer=KeyTempChar;
KeyTempChar=inportb(0x61);
outportb(0x61,KeyTempChar|0x80);
outportb(0x61,KeyTempChar&0x7f);
if((KeyScBuffer!=0xe0) && (KeyScBuffer!=0xe1))
{
KeyScanCode=KeyScBuffer;
if(KeyScBuffer==0xe0)
KeyScanCode|=0xe000;
if((KeyScBuffer==0xe1) &&
((KeyScBuffer==0x1d) || (KeyScBuffer==0x9d)))
KeyScanCode|=0xe100;
if((KeyScanCode!=0xe02a) &&
(KeyScanCode!=0xe0aa) &&
(KeyScanCode!=0xe036) &&
(KeyScanCode!=0xe0b6) &&
(KeyScBuffer!=0xe1))
KeyboardProc();
}
asm sti
outportb(0x20,0x20);
}
//这是一段测试程序,可以显示出当前按下或者抬起那个按键:
char FmtKscCode="%-10s\r\n";
char FmtUnkName="\rScanCode: ";
char StrKeyName="Press any key or Esc to quit ...";
char ByeStr);
}
else
{
cprintf(FmtKeyName, KeyNames00);
}
}
else
{
cprintf(FmtUnkName, ksCode&0xff7f);
}
textcolor(LIGHTBLUE);
cprintf(StrWait);
ksCode=0;
}
}
textcolor(LIGHTGRAY);
cprintf(ByeStr);
ResOldKb();
return 0;
}
Top
希望对你有帮助