Qt5文件及磁盘处理

Qt提供了QFile类用于进行文件操作。QFile类提供了读写文件的接口,可以读写文本文件、二进制文件和Qt的资源文件。

  • 处理文本文件,可使用QTextStream类,它可以操作QIODevice/QByteArray和QString。使用QTextStream的流操作符,可以方便地读写单词、行和数字。为了产生文本,QTextStream还提供了填充、对齐和数字格式化的选项。
  • 处理二进制文件,可以使用QDataStream类,它提供了将二进制文件穿行化的功能,用于实现C++基本数据类型,如char、short、int、char*等的串行化。更复杂的串行化的操作则是通过数据类型分解为基本类型来完成的。
  • 处理临时文件,可使用QTemporaryFile类
  • 获取文件信息,可以使用QFileInfo类
  • 处理目录可以使用QDir类,QDir类具有存取目录结构和内容的能力,使用它可以操作目录、存取目录或文件信息、操作底层文件系统,而且还可以存取Qt的资源文件。
  • 监视文件和目录变化,可以使用QFileSystemWatcher类

处理文本文件

#include <QCoreApplication>
#include <QFile>
#include<QDebug>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //打开文件有两种方式,一是在构造函数中指定文件名,另一种是使用setFileName()函数设置文件名
    QFile data("data.txt");
//    QFile file("textFile1.txt");
    //Truncate表示将原来的文件中的内容清空
    if(data.open (QIODevice::WriteOnly | QFile::Truncate))
    {
        QTextStream out(&data);
        out<<"score:"<<qSetFieldWidth (10)<<left<<90<<endl;
    }
    return a.exec();
}

(a) if(data.open(QFile::WriteOnly|QFile::Truncate)):参数QFile::Truncate表示将原来文件中的内容清空。输出时将格式设为左对齐,占10个字符位置。
(b) out<<QObject::tr(“score:”)<<qSetFieldWidth(10)<<left<<90<<endl:用户使用格式化函数和流操作符设置需要的输出格式。其中,qSetFieldWidth()函数是设置字段宽度的格式化函数。除此之外,QTextStream还提供了其他一些格式化函数,见表。
在这里插入图片描述
其中,left操作符是QTextStream定义的类似于中的流操作符。QTextStream还提供了其他一些流操作符
在这里插入图片描述

目录操作

使用QDir类的entryInfoList()方法,按照某种过滤方式获得目录下的文件列表。

    QString root = "/";
    QDir rootDir(root);
    QStringList string;
    string << "*";
    QFileInfoList list = rootDir.entryInfoList (string);

函数原型:

    /**
     * nameFilters  指定了文件名的过滤方式,如“*”,“.tar.gz"
     * filters 指定了文件属性的过滤方式,如目录、文件、读写属性
     * SortFlags 指定了列表的排序情况
     *QFileInfoList entryInfoList(
				     const QStringList &nameFilters, 
				     Filters filters = NoFilter,
				     SortFlags sort = NoSort) const;
     */

其中,QDir::Filter定义了一系列的过滤方式:
在这里插入图片描述
QDir::SortFlag定义了一系列排序方式:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要对磁盘上的视频文件进行编码,需要做一些修改以读取视频文件并将编码后的数据写入新的文件中。以下是一个示例代码,演示了如何对指定的视频文件进行编码: ```c++ #include <QtCore/QCoreApplication> #include <QDebug> extern "C" { #include <libavcodec/avcodec.h> #include <libavformat/avformat.h> #include <libavutil/imgutils.h> #include <libswscale/swscale.h> } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // Open input file AVFormatContext *inputContext; avformat_open_input(&inputContext, "input.mp4", NULL, NULL); avformat_find_stream_info(inputContext, NULL); // Find video stream int videoStreamIdx = -1; for (int i = 0; i < inputContext->nb_streams; i++) { if (inputContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { videoStreamIdx = i; break; } } if (videoStreamIdx == -1) { qWarning() << "No video stream found in input file!"; return -1; } // Set up codec parameters AVCodecParameters *codecParams = inputContext->streams[videoStreamIdx]->codecpar; codecParams->codec_id = AV_CODEC_ID_H264; codecParams->bit_rate = 400000; // Set up output file AVFormatContext *outputContext; avformat_alloc_output_context2(&outputContext, NULL, NULL, "output.mp4"); AVStream *outputStream = avformat_new_stream(outputContext, NULL); outputStream->codecpar = codecParams; // Open codec AVCodec *codec = avcodec_find_encoder(codecParams->codec_id); AVCodecContext *codecContext = avcodec_alloc_context3(codec); avcodec_parameters_to_context(codecContext, codecParams); avcodec_open2(codecContext, codec, NULL); // Open output file avio_open(&outputContext->pb, "output.mp4", AVIO_FLAG_WRITE); avformat_write_header(outputContext, NULL); // Set up scaling context SwsContext *imgConvertCtx = sws_getContext(codecParams->width, codecParams->height, codecParams->format, codecParams->width, codecParams->height, codecParams->format, SWS_BICUBIC, NULL, NULL, NULL); // Loop through frames AVPacket *inputPacket = av_packet_alloc(); AVFrame *inputFrame = av_frame_alloc(); AVPacket *outputPacket = av_packet_alloc(); while (av_read_frame(inputContext, inputPacket) >= 0) { if (inputPacket->stream_index == videoStreamIdx) { // Decode frame avcodec_send_packet(codecContext, inputPacket); avcodec_receive_frame(codecContext, inputFrame); // Convert frame to codec format AVFrame *outputFrame = av_frame_alloc(); outputFrame->width = codecParams->width; outputFrame->height = codecParams->height; outputFrame->format = codecParams->format; av_image_alloc(outputFrame->data, outputFrame->linesize, codecParams->width, codecParams->height, codecParams->format, 32); sws_scale(imgConvertCtx, inputFrame->data, inputFrame->linesize, 0, codecParams->height, outputFrame->data, outputFrame->linesize); // Encode frame avcodec_send_frame(codecContext, outputFrame); avcodec_receive_packet(codecContext, outputPacket); // Write encoded frame to output file av_interleaved_write_frame(outputContext, outputPacket); // Clean up av_packet_unref(outputPacket); av_frame_unref(outputFrame); } av_packet_unref(inputPacket); } // Flush codec avcodec_send_frame(codecContext, NULL); while (avcodec_receive_packet(codecContext, outputPacket) == 0) { av_interleaved_write_frame(outputContext, outputPacket); av_packet_unref(outputPacket); } // Close codec, input file, output file, and cleanup avcodec_close(codecContext); avformat_close_input(&inputContext); avio_close(outputContext->pb); avformat_free_context(outputContext); sws_freeContext(imgConvertCtx); av_packet_free(&inputPacket); av_frame_free(&inputFrame); av_packet_free(&outputPacket); return a.exec(); } ``` 这个示例代码会打开一个名为 "input.mp4" 的视频文件,并将编码数据写入一个名为 "output.mp4" 的新文件中。请注意,这只是一个大致的示例,可能需要根据您的具体情况进行修改。此外,为了简化代码,一些错误检查和异常处理可能被省略了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SOC罗三炮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值