向Unicode文件写汉字出错

xali 2011-05-10 05:05:24
有个Unicode文件,文件头是FFFE,其中有英文字符,也有汉字串,假设是“文件含有汉字”。
问题是:想改变其中的一些汉字,比如改成“文件改写汉字”,文件长短不变。总是出错。
...全文
125 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-05-10
  • 打赏
  • 举报
回复
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
子达如何 2011-05-10
  • 打赏
  • 举报
回复
是不是打开了文件忘记fseek了?
ljt3969636 2011-05-10
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=1397
lt114896 2011-05-10
  • 打赏
  • 举报
回复
http://baike.baidu.com/view/2083430.htm
xali 2011-05-10
  • 打赏
  • 举报
回复
谢谢大家,我用UltraEdit查看是Unicode格式,用Hex WorkShop查看是UTF-8格式,按照UTF-8格式改文件似乎对了。不明白UltraEdit为什么会这样,也许版本有些旧,用的太久了。
白云飘飘飘 2011-05-10
  • 打赏
  • 举报
回复
	wchar_t *s=L"中国";
int pos=5;//起始位置

FILE *f=fopen("a.txt","rb+");
fseek(f,(pos+1)*sizeof(wchar_t),SEEK_SET);
fwrite(s,wcslen(s)*sizeof(wchar_t),1,f);
fclose(f);
xali 2011-05-10
  • 打赏
  • 举报
回复
是我加字符时文件格式自动该换了,抱歉!如果是Unicode,结果正确。
谢谢大家,我再试验一下,好了就结。
aa_niaofang 2011-05-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xali 的回复:]
楼上给出的程序我在VC控制台方式下,执行正确。
问题是我给文件开始随便加两个字母sd,结尾加几个字母dj……
仅仅按程序最后一段读取得到结果:73 64 e6 96 87 e4 bb b6 e5 90 ab e6 9c 89 ……
改的时候就也错了。你用的函数我昨天也试过,可是觉得不行。能否帮我看看,中英文混合时,
是什么原因?这个以前没遇到过,哪位能解决好?
[/Quote]

没试过 给你个建议 直接当二进制流写不管是中文还是英文 一致对待
xali 2011-05-10
  • 打赏
  • 举报
回复
楼上给出的程序我在VC控制台方式下,执行正确。
问题是我给文件开始随便加两个字母sd,结尾加几个字母dj……
仅仅按程序最后一段读取得到结果:73 64 e6 96 87 e4 bb b6 e5 90 ab e6 9c 89 ……
改的时候就也错了。你用的函数我昨天也试过,可是觉得不行。能否帮我看看,中英文混合时,
是什么原因?这个以前没遇到过,哪位能解决好?
xali 2011-05-10
  • 打赏
  • 举报
回复
谢谢楼上,我研究下。
赵4老师 2011-05-10
  • 打赏
  • 举报
回复
#include <stdio.h>
FILE *f;
unsigned char buf[15];
unsigned char hz[5]="\x39\x65\x99\x51";// "改写"的Unicode
int i;
void main() {
f=fopen("u.txt","rb+");//Unicode BOM+文件含有汉字 对应字节ff fe 87 65 f6 4e 2b 54 09 67 49 6c 57 5b
fread(buf,1,14,f);
for (i=0;i<14;i++) {
printf("%02x ",buf[i]);
}
printf("\n");
fseek(f,6,SEEK_SET);
fwrite(hz,1,4,f);
fclose(f);

f=fopen("u.txt","rb");
fread(buf,1,14,f);
for (i=0;i<14;i++) {
printf("%02x ",buf[i]);
}
fclose(f);
}
//ff fe 87 65 f6 4e 2b 54 09 67 49 6c 57 5b
//ff fe 87 65 f6 4e 39 65 99 51 49 6c 57 5b
赵4老师 2011-05-10
  • 打赏
  • 举报
回复
两处for (i=0;i<15;i++)都应改为for (i=0;i<14;i++)
后面就不会多出一个00了
赵4老师 2011-05-10
  • 打赏
  • 举报
回复
#include <stdio.h>
FILE *f;
unsigned char buf[15];
unsigned char hz[5]="\x39\x65\x99\x51";// "改写"的Unicode
int i;
void main() {
f=fopen("u.txt","rb+");
fread(buf,1,14,f);
for (i=0;i<15;i++) {
printf("%02x ",buf[i]);
}
printf("\n");
fseek(f,6,SEEK_SET);
fwrite(hz,1,4,f);
fclose(f);

f=fopen("u.txt","rb");
fread(buf,1,14,f);
for (i=0;i<15;i++) {
printf("%02x ",buf[i]);
}
fclose(f);
}
//ff fe 87 65 f6 4e 2b 54 09 67 49 6c 57 5b 00
//ff fe 87 65 f6 4e 39 65 99 51 49 6c 57 5b 00
xali 2011-05-10
  • 打赏
  • 举报
回复
上面的dirname就是文件名称。
xali 2011-05-10
  • 打赏
  • 举报
回复
我还试过:
CFile file;
file.Open(dirname,CFile::modeReadWrite);

FILE *file = fopen(dirname,"rb+");
都没有做到,其它写文件方式没试过,哪位高手试试,成功了给高分,想不到这么个小问题把人难住了。
xali 2011-05-10
  • 打赏
  • 举报
回复
#include <fstream>
#include <iostream>

setlocale(LC_ALL, "chs");
std::wofstream file(filename,ios::out|ios::in);
file.seekp(100,ios::beg);//100是原来的汉字串位置
file.write(L"文件改写汉字",6);
file.close();

//上述程序实现不了。如果谁能做到,两个帖子分一起给。不过一般的方法就不用试了,可能会浪费你的时间,有没有以前做过的,给个可以执行的程序例子?要求是保持原文件,只改变其中的几个汉字。
白云飘飘飘 2011-05-10
  • 打赏
  • 举报
回复
首先要用setlocal把当前区域设置为中文,再用w版本的函数写入

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧