鱼C论坛

 找回密码
 立即注册
查看: 4415|回复: 12

[技术原创] 151-文本流读/写文本文件-【扫盲】

[复制链接]
发表于 2016-11-4 16:08:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 不二如是 于 2016-11-4 16:31 编辑

0.png


没错啦,只要把上面的帮助文档,翻一下,就是这一贴啦~

好,开始翻译~

QTextStream类提供了一个方便的接口来读/写文本,可以在QIODevice、QByteArray、QStrirng上进行操作。

使用QTextStream的流操作符(<<),可以方便的读/写单词、行、数字。

对于生成文本,QTextStream对字段填充、对齐、数字格式提供了选项支持~

  1. QFile data("output.txt");
  2. if (data.open(QFile::WriteOnly | QFile::Truncate)) {
  3.     QTextStream out(&data);
  4.     out << "Result: " << qSetFieldWidth(10) << left << 3.14 << 2.7;
  5.     // writes "Result: 3.14      2.7       "写入Resule:3.14 2.7
  6. }
复制代码


QTextStream提供的所有格式选项可以在该类的帮助文档进行查看。

setDevice()、setString()同样可以设置QTextStream要操作的设备或者字符串。

在内部,QTextStream使用了一个基于Unicode的缓冲区。主要就是用来Mingw482支持中文的哈~

重点来了~

使用QTextStream读取文本文件一般使用一下3种方式!


  • 进行一行接着一行的读取

    调用readLine()或者readAll()进行行读取~举一个之前用过的代码:
    1. QFile file(“in.txt”);
    2. if(! file.open(QIODevice::ReadOnly | QIODevice::Text))
    3.         return;
    4. QTextStream in(&file);
    5. while(! in.atEnd())
    6. {
    7. //进行行读取
    8.         QString line = in.readLine();
    9. }
    复制代码



  • 一个单词接着一个单词

    QTextStream支持到QString、QByteArray、char *缓冲区的流,单词由空格分开,而且可以自动跳过前导空格。


  • 一个字符接着一个字符

    使用QChar或者char类型的流,用于解析文件、使用独立的字符编码和行结束语义时方便处理。

    skipWhiteSpace()可用来跳过空格~



默认的,当从文本流中读取数字时,QTextStream会自动检测数字的基数表示。

  1. QTextStream in("0x50 0x20");
  2. int firstNumber, secondNumber;

  3. in >> firstNumber;             // firstNumber == 80
  4. in >> dec >> secondNumber;     // secondNumber == 0

  5. char ch;
  6. in >> ch;                      // ch == 'x'
复制代码


如果数字以‘0x’开头,自动假定为十六进制形式。

1~9开头,自动假定为十进制。

Qt提供了一个基于QTextStream、QFile、QDir的示例程序-

Find Files Dialog


很牛x~

有兴趣自己看啦~

1.gif

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-5 19:25:09 | 显示全部楼层
本帖最后由 wei_Y 于 2016-11-5 20:18 编辑

不二,我发现了Qt一个有趣的问题。

当然是PYQT。。

我把一个Qt对象写在类里面就会正常执行,写在函数里就不会正常执行。

比如有一个

  1. class Message(QMessageBox):
  2.     .......
复制代码


就是一个继承了MessageBox的类。

我如果是在另一个类里:
  1. class Main(QWidgets):
  2.    .....
  3.    msg = Message()
  4.    msg.exec()
复制代码


他会正常显示Message并且可以正常交互退出。

但是我如果把他搞在一个函数里。
def fff():
    msg = Message()
    msg.exec()

然后他 有时会显示出Message 但是不可交互而且界面会卡死,有时直接卡死。

类似的我又试了QNetworkAccessManager也是一样的问题。


还有一个问题:
Message  自定义大小好像没用?

resize 和 setFixedsize都试了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-6 14:02:02 | 显示全部楼层
wei_Y 发表于 2016-11-5 19:25
不二,我发现了Qt一个有趣的问题。

当然是PYQT。。

1.当你把某个类写进一个函数,要确定是否真的继承了这个类,没有的话,在最上面加上类似#include<QMessageBox>声明

2Message自定义大小?是用来限制传递信息大小吗?


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-6 14:12:59 | 显示全部楼层
不二如是 发表于 2016-11-6 14:02
1.当你把某个类写进一个函数,要确定是否真的继承了这个类,没有的话,在最上面加上类似#include声明

...

我就是实例化了这个继承自QT 类的自定义类。

然后如果是在另一个实例化的类里可以很好的执行,否则就不能执行其功能。
我猜是那个Application的问题。

自定义大小是 Message窗口的大小,不是内容的大小。

本来用QMessageBox觉得比较方便。。看来还是要换成QDialog了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-6 14:15:50 | 显示全部楼层
wei_Y 发表于 2016-11-6 14:12
我就是实例化了这个继承自QT 类的自定义类。

然后如果是在另一个实例化的类里可以很好的执行,否则就 ...

是阿,这就是为什么要分成QApplication->QWidget、QMainWindow、QDialog

彼此间是有不同功能区别的

有的可以直接调用某类,有的需要声明,但区别也就如此

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-6 14:19:25 | 显示全部楼层
不二如是 发表于 2016-11-6 14:15
是阿,这就是为什么要分成QApplication->QWidget、QMainWindow、QDialog

彼此间是有不同功能区别的

还有个新问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-6 14:21:01 | 显示全部楼层
wei_Y 发表于 2016-11-6 14:19
还有个新问题。

请讲:最好在你类似的帖子下面回复~

为后人扫清障碍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-6 14:25:43 | 显示全部楼层
不二如是 发表于 2016-11-6 14:15
是阿,这就是为什么要分成QApplication->QWidget、QMainWindow、QDialog

彼此间是有不同功能区别的

Qt4 里用 QApplication -> winEventFilter 可以捕获windows系统消息。
Qt5 里变成 QAbstractNativeEventFilter -> nativeEventFilter。

虽然确实是捕获到了windows消息。。
但是——c++里用reinterpret_cast 这个函数(还是內建函数!!!)转换成0x011这样的形式。
但是python里木有reinterpret_cast 这个函数,
我试了QByteArray里所有的函数都不能转化成0x011这个形式。(toHex看着美好结果转出来是什么鬼!)

然后判断不了是什么消息啊。。

问题是:  怎么判断 收入的消息类型。

最终目标是:  全局热键捕获。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-6 14:28:15 | 显示全部楼层
不二如是 发表于 2016-11-6 14:21
请讲:最好在你类似的帖子下面回复~

为后人扫清障碍

2333,还没出到全局热键的文章。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-6 16:38:03 | 显示全部楼层
wei_Y 发表于 2016-11-6 14:28
2333,还没出到全局热键的文章。

会的~

我现在手头笔记本没法搞Qt,周一我试试告诉你结果哈~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-7 09:31:55 | 显示全部楼层
wei_Y 发表于 2016-11-6 14:25
Qt4 里用 QApplication -> winEventFilter 可以捕获windows系统消息。
Qt5 里变成 QAbstractNativeEvent ...

1.
  1. QByteArray ba;
  2. ba.resize(5);
  3. ba[0] = 0x3c;
  4. ba[1] = 0xb8;
  5. ba[2] = 0x64;
  6. ba[3] = 0x18;
  7. ba[4] = 0xca;
复制代码


QByteArray 支持判断信息类型。。。并且初始化0x -也就是16进制

2.直接强制换。。。
十进制->十六进制
  1. i=1024;
  2.     ltoa(i,h,16);
  3.     sprintf(hs,"%08s",h);
  4.     printf("i=%d,hs=%s\n",i,hs);
复制代码

二进制-十六进制
  1. strcpy(bs,"00000000000000000000010000000000");
  2.     i=strtol(bs,&e,2);
  3.     ltoa(i,h,16);
  4.     sprintf(hs,"%08s",h);
  5.     printf("bs=%s,hs=%s\n",bs,hs);
复制代码


字符-十六进制
  1. strcpy(s,"a汉");
  2.     i=0;
  3.     while (1) {
  4.         if (0==s[i]) break;
  5.         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);
  6.         i++;
  7.     }
  8.     setlocale(LC_ALL,"chs");
  9.     printf("s=%s,hs=%s\n",s,hs);
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-10 12:24:27 | 显示全部楼层

换成win32的api了。。始终没搞定qt。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-10 13:24:38 | 显示全部楼层
wei_Y 发表于 2016-11-10 12:24
换成win32的api了。。始终没搞定qt。。

你要电脑上安装VS2010那些库、Qt很好搞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 17:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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