赞
踩
目录
C语言文件流类型 FILE ,一般定义为指针类型,文件操作主要使用以下API
fopen fopen_s fwrite fputs fread fgets fgetc fseek
fseek用来调整文件指针的位置,原型如下
fseek(
_Inout_ FILE* _Stream, //指向FILE结构体指针
_In_ long _Offset, //偏移量
_In_ int _Origin //指定文件指针的起始位置 //SEEK_CUR 当前位置
//SEEK_END 文件结尾位置 SEEK_SET 文件开始位置
);
C语言打开文件的方式如下
示例代码如下
- #include<stdio.h>
- #include<string.h>
-
- int main()
- {
- FILE* fp;
- char msg[256];
-
- #ifdef DEBUG
- //写文件
- fopen_s(&fp,"test.txt", "w+");
- fgets(msg, 255, stdin);
- #endif
- #ifdef DEBUG
- //追加写
- fopen_s(&fp, "test.txt", "a");
- fgets(msg, 255, stdin);
- fwrite(msg, 1, strlen(msg), fp);
- #endif
-
- //指定位置写
- fopen_s(&fp, "test.txt", "r+");
- fgets(msg, 255, fp);
- fseek(fp, 3, SEEK_SET);
- fwrite(msg, 1, strlen(msg), fp);
-
- //读文件
- fread(msg, 1, sizeof(msg), fp);
- printf("%s", msg);
- if(fp) fclose(fp);
- return 0;
- }
操作文件的三大类:
ofstream: 写操作
ifstream: 读操作
fstream: 读写操作
写文件步骤如下:
包含头文件
#include < fstream >
创建流对象
ofstream ofs;
打开文件
ofs.open(“文件路径” , 打开方式);
写数据
ofs<<“写入的数据”;
关闭文件
ofs.close();
打开方式 | 解释 |
---|---|
ios::in | 为读文件而打开文件 |
ios::out | 为写文件而打开文件 |
ios::ate | 初始位置:文件尾 |
ios:app | 追加方式写文件 |
ios::trunc | 如果文件存在,先删除,后创建 |
ios::binary | 二进制方式 |
读文件步骤如下:
包含头文件
#include < fstream >
创建流对象
ifstream ifs;
打开文件并判断文件是否打开成功
ifs.open(“文件路径” , 打开方式);
读数据
四种读取方式
关闭文件
ifs.close();
文件的四种读取方式:
- char buf[1024] = {0};
- while( ifs >> buf ){
- cout << buf << endl;
-
-
- char buf[1024] = {0};
- while( ifs.getline(buf, sizeof(buf)) ){
- cout << buf << endl;
- }
-
-
- string buf;
- while(getline(ifs,buf)){
- cout << buf << endl;
- }
-
-
- char c;
- while( (c = ifs.get()) != EOF ){
- cout << buf << endl;
- }
以二进制的方式对文件进行读写操作;
打开方式要指定为 ios::binary
写文件步骤如下:
包含头文件
#include < fstream >
创建流对象
ofstream ofs;
打开文件
ofs.open(“文件路径” , ios::out | ios::binary );
写数据
Person p = new Person(“张三”,17);
ofs.write((const char*)&p , sizeof(Person) );
关闭文件
ofs.close();
读文件步骤如下:
包含头文件
#include < fstream >
创建流对象
ifstream ifs;
打开文件并判断文件是否打开成功
ifs.open(“文件路径” , ios::in | ios::binary );
读数据
Person p;
ifs.read((const *)&p, sizeof(Person))
关闭文件
ifs.close();
win32 主要使用 CreateFile ReadFile WriteFile 三个api 进行文件操作
CreateFile
CreateFileW(
_In_ LPCWSTR lpFileName,//创建或打开的对象的名称
_In_ DWORD dwDesiredAccess,//访问方式 读,读-写 写 查询 0 GENERIC_READ GENERIC_WRITE
_In_ DWORD dwShareMode,//共享方式 0
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,//NULL 不能被子进程继承
_In_ DWORD dwCreationDisposition,//如何创建文件 CREATE_NEW CREATE_ALWAYS
_In_ DWORD dwFlagsAndAttributes,//设置文件的属性和标志
_In_opt_ HANDLE hTemplateFile//NULL
);
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,//要写入的字节数
LPDWORD lpNumberOfBytesWritten, //用来接收实际写入到文件的字节数
LPOVERLAPPED lpOverlapped
);
- HANDLE hFile;
-
- hFile = CreateFile(_T("3.txt"), GENERIC_WRITE, 0, NULL,
-
- CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
-
-
-
- if (hFile == INVALID_HANDLE_VALUE)
-
- {
-
- TRACE("INVALID_HANDLE_VALUE,ERRORCODE = %d",GetLastError());
-
- return;
-
- }
-
-
-
- DWORD dwWrites;
-
- WriteFile(hFile, "BingoWin32API", strlen("BingoWin32API"), &dwWrites, NULL);
-
- TRACE("##dwWrites = %d", dwWrites);
-
- CloseHandle(hFile);
- HANDLE hFile;
-
- hFile = CreateFile(_T("3.txt"), GENERIC_READ, 0, NULL,
-
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-
-
-
- char pBuf[100] = {0};
-
- DWORD dwReads;
-
- ReadFile(hFile, pBuf, 100, &dwReads, NULL);
-
- TRACE("##dwReads = %d", dwReads);
-
- CloseHandle(hFile);
- CFileDialog fileDlg(TRUE);
- fileDlg.m_ofn.lpstrTitle = "Test";
- fileDlg.m_ofn.lpstrFilter = "Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0";
- if (IDOK == fileDlg.DoModal())
- {
- CFile file(fileDlg.GetFileName(), CFile::modeRead);
- char szBuf[1024] = { 0 };
- DWORD dwFilelen;
- dwFilelen = file.GetLength();
- file.Read(szBuf, dwFilelen);
- file.Close();
- MessageBox(szBuf);
- }
- CFile file("4.txt",CFile::modeCreate|CFile::modeWrite);
- char szBuf[1024] = "MFC操作文件";
- file.Write(szBuf, strlen(szBuf));
- file.Close();
在QT中,我们时常要对文件进行各种操作,比如文件的创建、写入、拷贝和删除等等,这些都要用到QFile类。
QFile类提供了读写文件的接口。一般情况下,我们可以直接在调用构造函数的时候传递文件名,这是比较方便的方法。或者使用QFile创建对象,再调用setFileName()方法来设置文件路径。其中文件名中的路径分隔符要求必须是'/',其他分隔符QFile不支持。
常用接口
QFile构造函数:
QFile(const QString & name)
QFile(QObject * parent)
QFile(const QString & name, QObject * parent)
- //初始化时加载文件路径
- QFile file("F:/test/xxx.txt");
- //以读写的方式打开文件,成功返回true,失败返回false
- //想用其他方式打开文件,请看上面的文件打开模式
- bool ok = file.open(QIODevice::ReadWrite);
- //如果文件不存在,则创建并打开该文件
- //判断指定文件是否存在.也可以用来判断在指定路径下是否有文件和你将要创建的文件重名.
- //存在返回true,不存在返回false
- bool exist = QFile::exists("F:/test/xxx.txt");
- //把D盘里的xxx.txt拷贝到到F盘,命名为sss.txt
- //拷贝成功返回true,失败返回false
- bool ok = QFile::copy("D:/xxx.txt", "F:/sss.txt");
- QFile file("F:/xxx.txt");
- bool ok = file.rename("F:/sss.txt");
- //重命名成功返回true,失败返回false
- //也可以直接调用
- bool ok = QFile::remove("F:/xxx.txt", "F:/sss.txt");
- QFlags<QFileDevice::Permission> power = QFile::permissions("F:/xxx.txt");
- //判断文件所有者是否可读
- if (power.testFlag(QFile::ReadOwner))
- qDebug("Can Read!");
- //定义文件内容字符串
- QString str= "写入文件的内容";
- QFile file("F:/xxx.txt");
- //打开文件,不存在则创建
- file.open(QIODevice::ReadWrite | QIODevice::Text);
- //写入文件需要字符串为QByteArray格式
- file.write(str.toUtf8());
- file.close();
- //先打开文件
- QFile file("F:/xxx.txt");
- file.open(QIODevice::ReadOnly | QIODevice::Text);
-
- //使用QTextStream一行一行读取文件
- QTextStream in(&file);
- while (!in.atEnd())
- {
- QString line = in.readLine(); //整行读取
- qDebug() << line;
- }
- QFile file("F:/xxx.txt");
- bool ok = file.remove();
- //删除成功返回true,失败返回false
- //也可以直接调用
- bool ok = QFile::remove("F:/xxx.txt");
- QDir *dir = new QDir("F:/");
- QStringList filters;
- filters << "*.png" << "*.jpg" << "*.bmp"; //过滤器,过滤你想要的文件后缀
- //用链表保存过滤的文件名
- QList<QFileInfo> *fileInfo = new QList<QFileInfo>(dir->entryInfoList(filters));
-
- //获取文件数目、文件名称
- for(int i = 0; i < fileInfo->count(); i++)
- {
- //QFileInfo(路径名的Qstring字符串).filename可以直接取到路径中的文件名
- qDebug() << fileInfo->at(i).fileName();
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。