VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4054|回复: 10

奇怪问题:我有一个文本文件,里面有好多条记录,我想把里面的一个乱码用空格替换掉,

[复制链接]

1

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2021-4-22 18:30:02 | 显示全部楼层 |阅读模式
我本想用 TStringList   *txtlist=new   TStringList;
String   ss;   
   
      TStringList   *txtlist=new   TStringList;   
   
      txtlist->LoadFormFile("c:\\mytxt.txt");   
      for(int i=0;i<txtlist->Count;i++)
            {                 
                   ss=txtlist->Strings[i];
                   if(ss.Pos("字符串")>0)
                   ss=StringReplace(ss,"字符串","",-----------);
                   txtlist->Strings[i]=ss;
          }   
      txtlist->SaveToFile("c:\\mytxt.txt");   
   
      delete   txtlist;
现在问题是:
主要是用这种方法读不出记录时,只有第一行的一部分数据

不知还有其它什么办法可以实现?

用C来读,但如何进行替换呢?

万分感谢!
回复

使用道具 举报

0

主题

27

帖子

24.00

积分

新手上路

Rank: 1

积分
24.00
发表于 2021-4-22 21:00:01 | 显示全部楼层
改了改,好好的啊
凡是“字符串”变化成 空格 存成新名字mytxt1.txt

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  String   ss;
  TStringList   *txtlist=new   TStringList;
  txtlist->LoadFromFile("mytxt.txt");
  for(int i=0;i<txtlist->Count;i++)
  {
    ss=txtlist->Strings[i];
    TReplaceFlags Flags;
    Flags<<rfReplaceAll;
    if(ss.Pos("字符串")>0) ss=StringReplace(ss,"字符串"," ",Flags);
    txtlist->Strings[i]=ss;
  }
  txtlist->SaveToFile("mytxt1.txt");
  delete   txtlist;
}
回复

使用道具 举报

0

主题

8

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2021-4-22 21:30:02 | 显示全部楼层
TStringList的LoadFromFile一般只能处理文本,如果你的文件中有文本结束符(0x1A)或字串结束符(0x00),它就有问题了
C/C++的文件处理能力是很强的,最简的,用C标准函数就可以实现你的要求
1.用rename将mytxt.txt改名,如mytxt.bak
2.用fopen打开文件mytxt.bak,并新建文件mytxt.txt
3.用getc逐一读文件mytxt.bak,并判是否为乱符,如果是,改为空格写入mytxt.txt,否则直接写入文件mytxt.txt
4.重复3直到mytxt.bak文件结束
5.如果必要,删除文件mytxt.bak

回复

使用道具 举报

1

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2021-4-22 22:00:01 | 显示全部楼层
就是上述的问题,getc是只一个字符,我现在是两个字符,组成一个乱码的汉字了

用C的代码来个例子?
回复

使用道具 举报

1

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2021-4-22 22:30:01 | 显示全部楼层
这个汉字是转成都16进制是:9D7C
回复

使用道具 举报

0

主题

8

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2021-4-23 09:00:01 | 显示全部楼层
FILE *fp=fopen("d:\\temp\\t.txt","rb");
   FILE *fp1=fopen("d:\\temp\\t1.txt","wb");
   int c,c1;
   while((c=fgetc(fp))!=EOF)
      if (c!=0x9d)
         fputc(c,fp1);
         else
         {
             c1=fgetc(fp);
             if (c1!=0x7c)
               fputc(c,fp1);
             else
             {
               fputc(' ',fp1);   //以两个空格代替0x9d7c
               fputc(' ',fp1);
             }
         }
   fclose(fp);
   fclose(fp1);
}
回复

使用道具 举报

0

主题

8

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2021-4-23 09:15:01 | 显示全部楼层
刚发完,发现有一小bug,
             if (c1!=0x7c)
               fputc(c1,fp1); //这里应该为c1
回复

使用道具 举报

1

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2021-4-23 09:45:01 | 显示全部楼层
多谢!

我感觉还有一个问题

假如前一个字符是后半个字节是0x9d,后一个字符是前字节是0x7c,这样的话,也就替换掉了

回复

使用道具 举报

0

主题

8

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2021-4-23 10:00:01 | 显示全部楼层
这个就烦了,如果你的文件是unicode的或者是纯汉字(双字节)的话,还好处理(改用fgetwc,一次读两个字节)否则,这种二义性很难处理(包括ultra-edit这样的商业软件有时也有这个问题)
回复

使用道具 举报

0

主题

3

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2021-4-23 10:15:02 | 显示全部楼层
轉為WideString( unicode ) 然後再處理。處理完再轉回來。

可是如果你有些特殊的字無法轉換為 unicode ,這種轉換就會丟失那個字了。
100% 正確,要期待中文標准及軟件的統一了。

要不你就做兩次, unicode方式一次, c方式一次。 對比一下,智能選取一個,盡最大努力不出錯。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表