目录
文件类QFile编程
1、构造函数
QFile的构造函数通常有两种:
QFile() //构造一个没有名字的QFile对象,通常配合setFileName一起使用
QFile(const QString &name) //构造一个以name为文件名的QFile对象
示例: QFile fd; fd.setFilename();
等价于:QFile fd()
该操作仅仅关联到文件,此时还无法对文件进行读写。setFileName()可以为QFile对象设置操作的某个文件的文件名,文件名可以不带路径,也可以带相对路径或者绝对路径。如果文件名不带路径,则默认当前程序的当前路径。
2、设置文件名
void QFile::setFileName(const QString &name) //name:文件名,QT支持的文件路径分隔符为'/'。
设置文件名之后就可以打开文件进行读写操作了。
3、打开文件
函数:
bool QFile::open(QIODevice::OpenMode mode) //成功返回true, 失败返回false
//mode:打开文件的模式
mode如下:
QIODevice::ReadOnly:以只读模式打开文件
QIODevice::WriteOnly:以只写模式打开文件
QIODevice::ReadWrite:以可读可写模式打开文件
QIODevice::Text:以文本模式打开文件
QIODevice::Append:以追加模式打开文件,所有数据写入文件末尾,此模式下不可进行文件的读操作
QIODevice::Truncate:以截取模式打开文件,文件原本的内容被全部删除
这些模式可单独设置,也可选择合适模式组合使用,示例如下:
QIODevice::WriteOnly | QIODevice::Text
//以只写方式和文本方式打开文件。
4、关闭文件
函数:
void QFileDevice::close() //文件不再使用之后调用close()函数将文件操作关闭。
close()函数是QFile父类QFileDevice的成员函数。
5、读取文本文件
QFile类本身并没有提供从文件中读取数据的函数,而是利用了其祖先类QIODevice的成员读函数read()和readLine()。
函数(1):(read函数)
qint64 QIODevice::read(char*data, qint64 maxSize);
//data指向缓冲区,读取到的数据将放在缓冲区中;
//maxSize表示最多要读取的数据量(字节数)。如果成功读取到数据,则返回读取到的数据的字节数:如果发生错误,比如试图从以(WriteOnly)只写方式打开的设备读取数据时,此函数返回-1。如果没有可读取的数据,则此函数返回0。
示例代码:(读取全部文件内容)
//文件操作,打开当前程序路径下的某个txt文件并全部显示到控件textEdit中
QString path = QCoreApplication::applicationDirPath();//获取当前程序路径
qDebug()<<path;
QFile file(path+"/控制.txt");//设置文件为当前路径下的控制.txt
if(file.open(QFile::ReadOnly))//只读方式打开文件控制.txt
{
QTextStream in(&file);
//读取文件内容并追加到textedit控件中
while (!in.atEnd())//如果未到文本末尾则一直读取并追加显示
{
QString line = in.readLine();
ui->textEdit->append(line);
}
file.close();
}
函数(2):(readLine函数)
qint64 readLine(char*data, qint64 maxSize);
//data指向缓存区,存放读取到的行数据;
//maxSize表示最多要读取的字节数
//返回值:成功返回读取到的字节数; 没出错但是没读取到数据返回0; 发生错误返回-1
//字符串的终止字符‘\0’总是附加到读取数据的行末,因此,maxSize必须大于1.
这个函数的读取结束情况如下:
1、第一次读取到‘\n’
2、读取的数据量达到了maxSize-1
3、检测到设备(文件)的结束字符
示例代码:(从文件中读取一行字符):
//文件操作
QFile file("控制.txt");
if(file.open(QFile::ReadOnly))//只读方式打开文件控制.txt
{
char buff[1024];//定义缓冲区数组
int len = file.readLine(buff, sizeof(buff));
if(len != -1)
{
qDebug()<<buff;
ui->textEdit->setText(buff);
}
else
qDebug()<<"文件打开失败:"<<len;
}
6、从文件中读取二进制数据
QFile类本身并没有提供从文件中读取数据的函数,而是利用了其祖先类QIODevice的成员读函数read()。
函数:
QByteArray read(qint64 maxSize);
该函数最多读取maxSize个字节的数据,内部位置指针后移maxSize,并返回一个QByteArray对象。该函数用于读取二进制文件。
另外,QIODevice::readAll()函数会从设备(比如磁盘文件)中读取所有数据,并返回QByteArray对象,即一个字节数组。
函数:
QByteArray readAll();
该函数返回QByteArray对象,通常用于读取二进制文件。
QString path = QCoreApplication::applicationDirPath();//获取当前程序路径
qDebug()<<path;
QFile file(path+"/控制1.txt");//设置文件为当前路径下的控制.txt
QByteArray data;
if(file.open(QFile::ReadOnly))//文件打开成功
{
data = file.readAll();//读取全部文件
file.close();//关闭文件
}
7、写入文本文件
QFile类本身并没有提供从文件中读取数据的函数,而是利用了其祖先类QIODevice的成员函数write()。
(1)、最多写maxSize个字符到文件中
qint64 write(const char* data, qint64 maxSize);
data:要写入的数据
maxSize:表示最多能写入的字符数
返回值:如果函数写入成功,返回实际写入的字节数;如果发生错误,就返回-1.
(2)、直接写入数据
qint64 write(const char*data);
示例代码
QString path = QCoreApplication::applicationDirPath();//获取当前程序路径
qDebug()<<path;
QFile file(path+"/控制.txt");//设置文件为当前路径下的控制.txt
//内容写入
if(file.open(QIODevice::WriteOnly | QIODevice::Append))//只写方式打开文件控制.txt
{
//写入文本内容
file.write("大家好呀,我们一起加油!\n");
file.close();
}
//内容查看
if(file.open(QIODevice::ReadOnly))//只读方式打开文件控制.txt
{
//显示文件查看写入成功与否
QTextStream in(&file);
//读取文件内容并追加到textedit控件中
while (!in.atEnd())//如果未到文本末尾则一直读取并追加显示
{
QString line = in.readLine();
ui->textEdit->append(line);
}
file.close();
}
示例效果
8、写入二进制文件
QFile类本身并没有提供从文件中读取数据的函数,而是利用了其祖先类QIODevice的成员函数write()。
函数:
qint64 write(const QByteArray &byteArray);
byteArray表示要写入的数据,写入成功返回写入的字节数,否则返回-1.
示例代码
QString path = QCoreApplication::applicationDirPath();//获取当前程序路径
qDebug()<<path;
QFile file(path+"/控制.txt");//设置文件为当前路径下的控制.txt
//内容写入
QByteArray data;
data.resize(6);
data[0] = 0x2c;
data[1] = 0x3e;
data[2] = 0x4b;
data[3] = 0x5c;
data[4] = 0x6a;
data[5] = 0x7f;
if(file.open(QIODevice::WriteOnly | QIODevice::Append))//只写方式打开文件控制.txt
{
//写入文本内容
file.write(data);
file.write("\n");
file.close();
}
//内容查看
if(file.open(QIODevice::ReadOnly))//只读方式打开文件控制.txt
{
//显示文件查看写入成功与否
QTextStream in(&file);
//读取文件内容并追加到textedit控件中
while (!in.atEnd())//如果未到文本末尾则一直读取并追加显示
{
QString line = in.readLine();
ui->textEdit->append(line);
}
file.close();
}
由于写入文本文件之中时16进制数据会转换为对应的ASCII字符,所以此处显示为",k\j"。
9、判断文件是否存在
判断文件是否存在是常用的文件操作。QFile类的成员函数exists()可以用来判断文件是否存在。
函数: bool exists();
文件存在返回true,文件不存在返回false。
QString path = QCoreApplication::applicationDirPath();//获取当前程序路径
qDebug()<<path;
QFile file(path+"/控制.txt");//设置文件为当前路径下的控制.txt
if(file.exists())
ui->textEdit->setText("该文件存在");
else
ui->textEdit->setText("该文件不存在");
10、获取文件名
QFile类的成员函数fileName()可以用来获取文件。
QString fileName(); 函数返回QString类型的文件名。
11、返回文件大小
QFile类的成员函数size()可以用来获取文件大小。
函数:
qint64 size();
因为该函数的返回值是qint64(64位数据类型),故而可以返回大文件的大小。
对于打开的随机访问设备,此函数返回设备的大小;如果打开的顺序访问设备,将返回byteAvailable();如果设备关闭了,那么返回的大小将不反映设备的实际大小。
12、删除文件
QFile类的静态成员函数remove()可以用来删除文件。
函数:
bool QFile::remove(const QString &fileName);
fileName表示要删除文件的文件名。
同时,QFile类也提供了非静态成员函数版本的remove(),使用的前提是QFile对象已经关联到某个文件。
bool remove(const QString &fileName);
fileName表示要删除的文件名,如果删除成功返回true,失败返回false。
QString path = QCoreApplication::applicationDirPath();//获取当前程序路径
qDebug()<<path;
QFile file(path+"/控制1.txt");//设置文件为当前路径下的控制.txt
if(file.exists())
ui->textEdit->setText("该文件存在\n");
else
ui->textEdit->setText("该文件不存在\n");
//删除该文件
file.remove();
if(file.exists())
ui->textEdit->append("该文件存在\n");
else
ui->textEdit->append("该文件不存在\n");
13、重命名文件
QFile类的静态成员函数rename()可用来重命名文件。
函数(1):
bool QFile::rename(const QString &oldName,const QString &newName);
oldName:表示文件本身的名字; newName:表示文件需要修改成的名字。 成功返回true,失败返回false。
QFile类提供的非静态成员函数rename(),前提:QFile对象已经关联到文件
函数(2):
bool rename(const QString &newName); //newName:表示文件需要修改成的名字。 成功返回true,失败返回false。
QString path = QCoreApplication::applicationDirPath();//获取当前程序路径
qDebug()<<path;
QFile file(path+"/控制.txt");//设置文件为当前路径下的控制.txt
if(file.exists())
ui->textEdit->setText("该文件存在\n");
else
ui->textEdit->setText("该文件不存在\n");
if(file.rename(path+"木兰辞.txt"))
{
ui->textEdit->append("文件重命名成功\n");
}
else
ui->textEdit->append("文件重命名失败\n");
14、复制文件
QFile的静态函数copy()可实现复制文件的操作,成功返true,失败返回false。
函数如下: bool QFile::copy(const QString &fileName, const QString &newName);
fileName:源文件的文件名; newName:复制后新文件的文件名。 成功返回true,失败返回false。
QFile的非静态成员函数,前提:QFile对象成功关联到文件。
函数如下: bool copy(const QString &newName);
//newName:复制后新文件的文件名。 成功返回true,失败返回false。
(1)、复制、重命名文件(静态函数版)
QString path = QCoreApplication::applicationDirPath();//获取当前程序路径
qDebug()<<path;
QFile file(path+"/木兰辞.txt");//设置文件为当前路径下的控制.txt
if(file.exists())
ui->textEdit->setText("该文件存在\n");
else
ui->textEdit->setText("该文件不存在\n");
if(QFile::copy(path+"/木兰辞.txt", path+"/木兰辞复制.txt"))
{
ui->textEdit->append("木兰辞复制成功");
}
else
ui->textEdit->append("木兰辞复制失败");
(2)、复制、重命名文件(非静态函数版)
QString path = QCoreApplication::applicationDirPath();//获取当前程序路径
qDebug()<<path;
QFile file(path+"/木兰辞.txt");//设置文件为当前路径下的控制.txt
if(file.exists())
ui->textEdit->setText("该文件存在\n");
else
ui->textEdit->setText("该文件不存在\n");
if(file.copy(path+"/木兰辞复制2.txt"))
{
ui->textEdit->append("木兰辞复制成功");
}
else
ui->textEdit->append("木兰辞复制失败");