C语言读写文件的时候怎么控制字符编码方式?
有明白的请给下提示?就是读写的时候控制一下,以UTF-8的编码方式读写文件。 展开
C语言读写文件有两种方式: 一种是文本方式,另一种是2进制方式。日文,中文,unicode, 都要用2进制方式。文件内容的编码和编码的转化,同一种编码的大端或小端编码,都要自己安排处理。
C语言不管读写都要通过fopen函数来,其中mode参数可以控制以二进制打开还是以文本方式打开。
fopen的函数原型:FILE * fopen(const char * path,const char * mode);
fopen函数的第一个参数是文件路径,第二个参数是打开方式,有以下几种方式:
r 以只读方式打开文件,该文件必须存在。
r+ 以可读写方式打开文件,该文件必须存在。
rb+ 读写打开一个二进制文件,允许读数据。
rw+ 读写打开一个文本文件,允许读和写。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
wb 只写打开或新建一个二进制文件;只允许写数据。
wb+ 读写打开或建立一个二进制文件,允许读和写。
wt+ 读写打开或着建立一个文本文件;允许读写。
at+ 读写打开一个文本文件,允许读或在文本末追加数据。
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。
(1)用2进制方式打开文件
(2)读/写 UTF-8的编码文件 开头
有3 个特殊字节,数值是16进制: EF BB BF
(3)UCS 编码(16进制) 的 UTF-8 字节流(二进制) :
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
010000 -- 1FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
按此转换,用fwrite() 输出字节流。
或按字节 fread() 读入,判断高位,决定连读2个还是3个4个字节,译为 UCS
链接时要指定库文件。VC++是vfw32.lib, GCC是libvfw32.a.
我在VC6.0和GCC/MinGW 3.3.1下都通过了。
假设程序名是MyPlay, 目录下还有一个aaa.mp3, 运行MyPlay aaa.mp3即可。
注意Sleep(50000)是让他最多播放50秒。没有Sleep()的话,窗口一闪就退出了。
具体的MCI函数请查有关资料。
#include <windows.h>
#include <vfw.h>
int main(int argc, char* argv[])
{
if (argc>1) {
HWND MyPlayer = MCIWndCreate(NULL,GetModuleHandle(NULL), 0, argv[1]);
MCIWndPlay(MyPlayer);
Sleep(50000);
}
return 0;
}
这个程序还可以播放MIDI, AVI, WMV, MPG等影音文件。
如果只是后台播放MIDI或MP3,不想显示那个没有用的窗口,把MCIWndCreate()第三个参数0改成WS_POPUP即可。
如果想精确控制Sleep()至MP3播放结束,可以改成 Sleep(MCIWndGetLength(MyPlayer));
对于mp3, MCIWndGetLength()返回值的单位是毫秒,可以直接用于Sleep()延时。
对于mpg, MCIWndGetLength()返回值的单位是帧数,还要转换成毫秒才能用于Sleep().
具体MCIWndGetLength()返回值的单位是什么,可以调用MCIWndGetTimeFormat()来查询。
>是C,不是C++ 更不是Vc++
你误解了。VC6.0不只是支持C++, 也支持C. GCC更是C编译器,不是C++编译器。
这个程序是地地道道的C程序,没有一丁点儿 C++ 的成分。但是他调用了Windows API函数,所以必须用支持Windows编程的32位C编译器,不一定用VC或GCC。
很多人认为,刚学C语言最好用GCC或VC的命令行方式,但遗憾的大多教学用的C环境仍然选用20多年前的TC。如果坚持用16位的TC可以做一些事情,但在现在绝大多数事情是他做不到的。