QT输入输出(二) 之 QTextStream 测试

C++文本文件读写详解
本文详细介绍了C++中文本文件的读写方法,包括逐行读取、逐个字符读取及一次性读取,并提供了测试代码及结果分析。

写入文本容易,但是读入文本确实一个挑战,因为文本数据从根本上说就是含糊不清的。

例如写入"a"、"dog"   :out<<"a"<<"dog';

却读入"adog"             :in>>str1>>str2;    str1="adog",str2=""什么也没读到。

(一)

对于复杂的文件格式,成熟的解析器是必须的!

有三种读取方法:

(1)逐行读取

QTextStream::readLine()

(2)采用16位的QChar单元,逐个字符的读取!当然,要考虑换行符、制表符和空格。这个很精确,但相当麻烦。

(3)不考虑内存的开销,在文件较小的情况下,可以一次性读完。

QTextStream::readAll()


下面采用第三种方法测试:


(二)测试代码

记得添加中文支持:

QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForCStrings(codec);
否者中文乱码!

#include <QCoreApplication>
#include<QTextStream>
#include<QFile>
#include<QTextCodec>
#include<iostream>
#include<QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForCStrings(codec);
QFile file("test.txt");
if(!file.open(QIODevice::WriteOnly))
{
    std::cerr<<"can not open test.txt:"<<file.errorString().toStdString()<<endl;
}
QTextStream out(&file);
QString str("there is a saying goes :\r\n淡泊以明志,宁静以致远!");
out<<str;
file.close();

QFile file_in("test.txt");
if(!file_in.open(QIODevice::ReadOnly))
{
    std::cerr<<"can not open test.txt:"<<file.errorString().toStdString()<<endl;
}
QTextStream in(&file_in);
QString str1;
str1=in.readAll();
qDebug()<<str1<<endl;


    return a.exec();
}

(三)测试结果

1、保存到本地文档


2、从本地文档读取



(四)拓展

《C++ GUI QT 4》中利用readLine()函数先读取一行,再调用split(‘ ’)函数利用空格将QString拆分为QStringList,这样就可以获取一个个单词,也可借用join()函数再度组合。这个方法提供了很大的灵活性,值得关注。

QTextStrem in(&file);

while(!file.atEnd())

{

QString line = in.readLine();

QStringList  strlist  = line.split(' ');

int a = strlist.takeFirst();

QString str1 = strlist.takeFirst();

QString str2 = strlist.join("+");

}




<think>好的,我现在需要介绍一下Qt中的QTextStream(stdout)。首先,我得回忆一下Qt的相关知识,特别是关于输入输出的部分。QTextStreamQt中处理文本输入输出的一个类,对吧?它通常用来读写文件、字符串或者其他IO设备。那当它与stdout结合使用时,应该和标准输出有关。 用户提到的是QTextStream(stdout),这应该是指用QTextStream来操作标准输出流。在C++中,stdout是C标准库中的标准输出文件指针,通常用于控制台输出。Qt可能对stdout进行了封装,使其更符合Qt的风格,比如使用QTextStream提供的便捷方法。 接下来,我需要考虑QTextStream的基本用法。比如,使用QTextStream时,通常会绑定到一个QIODevice,比如QFile或者QTextStream本身可能支持像stdout这样的标准流。Qt可能允许将QTextStream直接绑定到stdout,这样可以利用Qt的流操作符来输出内容,而不必使用C语言的printf或者C++的cout。 然后,应该注意Qt中的文本编码问题。QTextStream默认使用的是本地编码,可能和系统的控制台编码相关。如果输出内容包含非ASCII字符,比如中文,可能需要设置正确的编码,比如UTF-8,以避免乱码。例如,调用setCodec方法设置编码格式。 另外,QTextStream提供了类似于C++标准库中流操作符的功能,比如使用<<操作符来输出各种类型的数据,包括QString、int、double等。这比C语言的printf更类型安全,也更方便与Qt的数据类型集成。 不过,需要注意的是,在Qt中,通常推荐使用Qt自己的输出方式,比如qDebug(),而不是直接操作stdout。qDebug()会自动处理调试信息的输出,并且可以在发布版本中轻松禁用。但用户可能是有特定的需求需要使用QTextStream(stdout),比如需要更精细的控制,或者希望与其他基于流的代码保持一致。 可能还需要提到QTextStream的一些其他功能,比如自动刷新缓冲区、设置字段宽度、填充字符等格式化选项。这些功能可以通过成员函数来设置,比如setFieldWidth(), setPadChar(), 或者使用流操作符如endl来刷新缓冲区。 此外,应该指出使用QTextStream(stdout)时的潜在问题。例如,混合使用C++的cout和QTextStream可能导致输出顺序混乱,因为两者的缓冲区是独立的。需要确保在适当的时候刷新缓冲区,避免输出信息不及时显示。 最后,可以给出一个简单的示例代码,展示如何创建QTextStream对象并绑定到stdout,然后使用流操作符输出内容。同时提醒编码设置的重要性,特别是在多语言环境下。 总结一下,回答的结构应该包括:QTextStream的作用,与stdout结合使用的场景,编码设置,常用方法和注意事项,以及示例代码。需要确保信息准确,结构清晰,帮助用户理解如何正确使用QTextStream来处理标准输出。</think>在Qt中,`QTextStream(stdout)` 是一种将标准输出(控制台)与Qt的文本流操作结合使用的方式。以下是逐步说明: --- ### **1. 基本概念** - **`QTextStream`**:Qt提供的文本流类,用于高效读写文本数据,支持格式化操作(如`<<`运算符)。 - **`stdout`**:C语言标准输出的文件指针,对应控制台输出。在Qt中,可通过`QTextStream`包装以利用Qt的特性。 --- ### **2. 核心作用** 将C风格的`stdout`与Qt的流操作结合,实现: - 类型安全的输出(无需`printf`的格式符)。 - 直接支持`QString`等Qt类型。 - 便捷的格式化控制(如编码、对齐等)。 --- ### **3. 典型用法** #### (1) 创建对象 ```cpp #include <QTextStream> #include <QCoreApplication> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QTextStream out(stdout); // 绑定到标准输出 // ... return a.exec(); } ``` #### (2) 输出内容 ```cpp out << "Hello, World!" << Qt::endl; // 使用Qt::endl刷新缓冲区 out << QString("你好") << 123 << 3.14; ``` #### (3) 设置编码(关键!) ```cpp out.setEncoding(QStringConverter::Utf8); // Qt6+ // 或旧版本: // out.setCodec("UTF-8"); // Qt5 ``` 确保控制台支持UTF-8以避免中文乱码。 --- ### **4. 格式化控制** - **字段宽度与对齐**: ```cpp out.setFieldWidth(10); out.setPadChar('-'); out << Qt::left << "Qt" << 5; // 输出:"Qt-------- 5" ``` - **数值进制**: ```cpp out << Qt::hex << 255; // 输出 ff ``` --- ### **5. 注意事项** - **缓冲区刷新**:默认自动刷新,但显式使用`Qt::endl`或`out.flush()`确保及时输出。 - **避免混合输出**:若同时使用`std::cout`,可能因缓冲区不同步导致输出顺序错乱。 - **性能**:频繁小数据量输出时,建议批量操作以减少IO开销。 --- ### **6. 与`qDebug()`对比** | 特性 | `QTextStream(stdout)` | `qDebug()` | |---------------------|---------------------------|---------------------------| | 用途 | 通用控制台输出 | 调试信息输出 | | 自动添加元信息 | 无 | 有(如文件名、行号) | | 发布模式禁用 | 否 | 是(通过`QT_NO_DEBUG_OUTPUT`)| | 多线程安全 | 需手动同步 | 是 | --- ### **7. 示例代码** ```cpp #include <QTextStream> #include <QCoreApplication> int main() { QTextStream out(stdout); out.setEncoding(QStringConverter::Utf8); out << "当前路径: " << QDir::currentPath() << Qt::endl; out << QString("中文字符测试") << Qt::endl; out.setFieldWidth(8); out.setPadChar('0'); out << Qt::hex << 255; // 输出: 000000ff return 0; } ``` --- ### **总结** `QTextStream(stdout)` 提供了一种Qt风格的标准输出方式,适合需要精细控制格式或与Qt类型深度集成的场景。使用时需注意编码设置和缓冲区管理,以确保兼容性和输出效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值