32-文件操作

文件操作

C语言和C++都提供语言级别的读取文件的操作。Windows操作系统也提供API支持。

1.C语言

1.如何获取文件大小
FILE* fp = fopen("1.txt","r");
fseek(fp,0,SEEK_END); //表示文件指针移动到最后(相对最后的偏移量为0)
int iLen = ftell(fp); //返回文件指针的当前位置,在该情况下是文件大小
2.读写文件函数

写文件

size_t __cdecl fwrite(
_In_reads_bytes_(_ElementSize * _ElementCount) void const* _Buffer, //写入数据的数组
_In_ size_t _ElementSize, //每个数据的单位(字节)
_In_ size_t _ElementCount, //数据大小
_Inout_ FILE* _Stream //文件指针
);

//example
FILE* fp = fopen("1.txt","w");
char szBuf[1024] = "hello";
int iLen = strlen(szBuf)+1;
fwrite(szBuf,1,iLen,fp);
fclose(fp);

读文件

size_t fread(
void *ptr, //读入数据的数组
size_t size, //每个数据的单位(字节)
size_t nmemb, //数据大小
FILE *stream //文件指针
);

//example
FILE* fp = fopen("1.txt","w");
char szBuf[1024] = {0};
fseek(fp,0,SEEK_END); //表示文件指针移动到最后(相对最后的偏移量为0)
int iLen = ftell(fp); //返回文件指针的当前位置,在该情况下是文件大小
fseek(fp,0,SEEK_SET); //将文件指针偏移回初始位置
fwrite(szBuf,1,iLen,fp);
fclose(fp);

2.C++

在创建对象时,构造函数里隐式地调用了open函数来打开文件。

1.写文件
ofstream ofs("2.txt");
char szBuf[] = "C++读取文件";
ofs.write(szBuf,strlen(szBuf));
ofs.close();
2.读文件
ifstream ifs("2.txt");
char szBuf[1024] = {0};
ifs.read(szBuf,1024);
ifs.close();

3.Windows Api

1.写文件
HANDLE hFile;
hFile = CreateFile(_T("3.txt"), GENERIC_WRITE, 0, NULL,CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); //文件不存在使用CREATE_NEW,否则使用CREATE_EXISTEN
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);
2.读文件
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);

4.MFC读写文件

1.写文件
CFile file("4.txt", CFile::modeCreate | CFile::modeWrite);
char szBuf[1024] = "MFC 操作文件";
file.Write(szBuf, strlen(szBuf));
file.Close();
2.读文件

正常读取

CFile file("4.txt", CFile::modeRead);
char szBuf[1024] = {0};
file.Read(szBuf, strlen(szBuf));
file.Close();

高阶操作,弹出一个选择窗口来选择文件

CFileDialog fileDlg(TRUE);						//创建一个选择窗口对象
fileDlg.m_ofn.lpstrTitle = "Test"; //窗口名称
fileDlg.m_ofn.lpstrFilter = "Text File(*.txt)\0*.txt\0All Files(*.*)\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);
}