C语⾔中以⽂本⽅式读写⽂件时换⾏符转换的注意事项
我们知道在UNIX下是没有回车符(\r)的,只有换⾏符(\n),⽽C语⾔诞⽣于UNIX(Linux即⾯向开源的UNIX,Mac OS也是UNIX发展⽽来的,⽽Windows是从MS-DOS发展⽽来,与前两者不同),所以C语⾔的源代码⽂件中也是以 \n 表⽰换⾏。
所以总结⼀下:
Windows下换⾏采⽤ \r\n 表⽰,全称回车换⾏符。
UNIX(Linux)下换⾏采⽤ \n 表⽰,即换⾏符。
Mac OS下换⾏采⽤ \r 表⽰,即回车符。
所以,当C语⾔在Windows下以⽂本⽅式读取⽂件就会出现⼀个转换,看如下代码:
FILE * f1;
f1 = fopen("", "r");
/*
""⽂件的⼗六进制结构如下:
41 42 43 0D 0A 44 44 4B
*/
linux换行按哪个键fseek(f1, 3, SEEK_SET);
printf("%x\n", getc(f1));
printf("%x\n", getc(f1));
fclose(f1);
输出结果:
a
44
Press any key to continue
解释:当我们把⽂件指针通过fseek函数移到位置 3 时,⽂件指针指向了回车符(0x0D),然后我们⽤getc函数读取当前⽂件指针所指的字节时,C语⾔会把Windows下表⽰换⾏的0x0D和0x0A两个字节看成UNIX下表⽰换⾏的0x0A⼀个字节,所以,此时getc函数返回的是0x0A 这个值。故,这次的getc函数读完后⽂件指针向后偏移两个字节,导致了下⼀个的getc返回的是0x44。
同理,当C语⾔在Windows下⼯作时,⽤putc向⽂件输⼊ \n 时会被⾃动转成 \r\n,如下代码:
FILE * f1;
f1 = fopen("", "w");
putc('\n', f1);
fclose(f1);
""⽂件的⼗六进制结构:
0D 0A
解释:上述代码会在当前⽬录创建⼀个新⽂件"",并以⽂本⽅式只写模式打开⽂件流,然后通过putc向该⽂件输⼊字符 \n,这时C语⾔会⾃动把 \n 转为 \r\n,原理同上。
注意的是:C语⾔是否⾃动转换 \n 与 \r\n 取决于编译C语⾔程序时所在的系统,也同理在Mac OS下,C语⾔会⾃动发⽣ \n 与 \r的转换。
当然,这种情况是不会发⽣转换的:
FILE * f1;
f1 = fopen("", "r");
/*
该⽂件的⼗六进制结构如下:
31 32 33 0A 0D
*/
fseek(f1, 3, SEEK_SET);
printf("%x\n", getc(f1));
printf("%x\n", getc(f1));
fclose(f1);
输出结果:
a
d
Press any key to continue
解释:因为只有在Windows下编译的C程序,并且以⽂本⽅式打开⼀个⽂件,并且读取的0x0D后⾯紧跟着0x0A才会发⽣转换,也就是说
0x0D 0x0A两个字节必须作为⼀个整体出现,显然,上述代码例⼦颠倒了 \r\n 的顺序。
另外,在Mac OS下编译的C程序,以⽂本⽅式读取⼀个以 \n 表⽰换⾏的⽂件时,也是不会发⽣ \r 与 \n的转换的,只有该⽂件以 \r 表⽰换⾏时才会发⽣ \r 与 \n的转换。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论