找回密码
 立即注册
收起左侧

linux下如何实现对文本的指定位置写入?

6
回复
10479
查看
[复制链接]

尚未签到

来源: 2013-7-7 15:32:15 显示全部楼层 |阅读模式
1Qter豆
本帖最后由 allsunday 于 2013-7-7 15:36 编辑

那个。。。我的系统是linux 我现在想实现一个功能是 通过QT creator设计图形界面(带有文本输入功能) 然后 改变一个*.py的文件里 指定位置的内容
通过seek()定位然后尝试了write()和QTextStream这两个方法
发现两个问题是
如果是seek(0)写入  那么整个文件就都重新改写了 以前的都没了
如果seek(255)到要改的参数的地方 写入的话 那么*.py这个文件又会出现乱码 请问这是不是编码的事情?
由于本人不是学计算机的……知识储备不是很足啊 找了一些QT的书 在文件的写入与读取方面的内容又是很少 《QTCREATOR快速土门》这本书里介绍这方面的内容也很少
想向大家求助{:soso_e100:}
ps.
可能我说的太乱了
主要目的是为一个批处理天文数据(python和idl编写的)的程序写一个图形化界面 这个程序只需要改一些文件地址和参数


以下是其中一个python的程序的一部分:
#!/usr/bin/python
#file name: makelc.py


import sys
import os
import re
import shutil
#**************************************************************************************************
#Input parameters for setting directory.
P_num='P92042'
path_d='/home/binary/xrdata/GX17+2/'        #Data directory
path_r='/home/binary/xrlt/GX17+2/'                #Result directory

比如我现在想更改“P_num”    “path_d”     “path_r”  这三个参数的内容该如何实现?可否给一点思路?

最佳答案

查看完整内容

在windows系统用的是unicode编码,你可以详细了解一下utf-8的编译方式。
回复

使用道具 举报

累计签到:181 天
连续签到:1 天
2013-7-7 15:32:16 显示全部楼层
在windows系统用的是unicode编码,你可以详细了解一下utf-8的编译方式。
回复

使用道具 举报

累计签到:181 天
连续签到:1 天
2013-7-8 08:26:53 显示全部楼层
linux系统的文件读写方式就是这样的。用seek移动文件指针后,再写入的时候,会覆盖掉后边的内容,如果想实现你这样的功能,只能是把文件内容完整读出,然后在内存在修改完成后再完整写入到文件里。
还有,你说的筹码问题有两个可能的原因。第一个可能是编码的问题,linux系统默认的编码为utf8,如果你的应用程序只在linux下用了,哪么这种可能性不大。第二个可能的原因是你的.py文件时非单字节编码字符。当你写入的时候破坏了文本编码。根据你的描述,这种可能性大一些。
回复

使用道具 举报

尚未签到

2013-7-9 13:58:05 显示全部楼层
hzzhou 发表于 2013-7-8 08:26
linux系统的文件读写方式就是这样的。用seek移动文件指针后,再写入的时候,会覆盖掉后边的内容,如果想实 ...

您好 我查看了该文件的编码是 7bit ASCII characters
utf-8不是与ASCII兼容吗?
我用了
QTextCodec *codec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForTr(codec);
然后 编辑-选择编码 改成utf-8
还是乱码的


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTextCodec *codec = QTextCodec::codecForName("utf-8");
    QTextCodec::setCodecForTr(codec);
      QFile file("makexdf.py");
      if (!file.open(QIODevice::WriteOnly  | QIODevice::Text))
          qDebug() << file.errorString();
      file.seek(2);
      file.write("12345");
      file.close();
      return a.exec();
  }

尝试了下 txt文件也是这样的
请问这是为什么阿咋解决阿?...
回复

使用道具 举报

尚未签到

2013-7-9 19:29:14 显示全部楼层
hzzhou 发表于 2013-7-8 08:26
linux系统的文件读写方式就是这样的。用seek移动文件指针后,再写入的时候,会覆盖掉后边的内容,如果想实 ...

我又尝试了一下在windows下的Qt 没有出现乱码的情况 这到底是怎么回事
回复

使用道具 举报

尚未签到

2013-7-10 17:01:34 显示全部楼层
本帖最后由 allsunday 于 2013-7-10 17:06 编辑
hzzhou 发表于 2013-7-9 23:18
在windows系统用的是unicode编码,你可以详细了解一下utf-8的编译方式。

谢谢您问题解决了 现在能实现在指定的地方插入字符串了
但是现在有个困难

我的思路是有3个lineEdit和1个pushbutton控件 把三个文本输入后 按下按钮 发射信号 槽函数把3个文本的值分别储存到 3个QString: str1 str2 str3
然后str1 str2 str3 传输到主函数中 在主函数中执行之前写入读写文件的程序

我是用qt设计器从左边拖拽了部件 在pushButton上右键-》转到槽

void MyWidget::on_pushButton_clicked()
{    QString str1 = lineEdit->text();   
      QString str2 = lineEdit_2->text();   
      QString str3 = lineEdit_3->text();
}
可是现在我不知道如何把槽函数中的str1 str2 str3传到main函数中
请问这样做是否可行? 还是应在在主函数之外执行读写文件的程序?请指教!

这是我写的main函数
int main(int argc, char *argv[])
{    QApplication a(argc, argv);   
MyWidget w;   
w.show();
//读取原本的文件   
QFile file1("0_makexdf.py");      
if (!file1.open(file1.ReadOnly) )           
QTextStream in(&file1);     
QString all = file1.readAll();
//写入新的文件(原文件不受干扰)  
QFile file2("makexdf.py");      
if (!file2.open(file2.WriteOnly) )         
qDebug() << file2.errorString();
all.insert((234), QString(str1));      
int n1= str1.size();              //返回字符串的长度      
all.insert((244+n1), QString(str2));      
int n2= str2.size();      
all.insert((270+n1+n2), QString(str3));
    QTextStream out(&file2);      
   out<<all;
    file1.close();    file2.close();       
return a.exec();
}
回复

使用道具 举报

累计签到:181 天
连续签到:1 天
2013-7-11 07:56:07 显示全部楼层
建设你在主函数之外来进行操作。一般的时候,主函数里不要放太多的东西。你这个操作完全可以在槽函数里完成的。
回复

使用道具 举报

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

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了