文章目录
- C语言文件操作
- 读文件
- 写文件
- 其他操作
- 文件指针重定位
- 获取指针位置
- 获取文件大小
- 重命名文件
- 删除文件
- C++文件操作
- 读文件
- 读文件
- Windows文件操作
- 读文件
- 写文件
- 其他操作
- 复制文件
- 删除文件/目录
- 判断目录是否存在
- 遍历目录下的文件和目录
- ATL读写文件
- Linux文件操作
C语言文件操作
文件访问模式字符串 | 含义 | 若文件不存在实动作 |
---|---|---|
“r” | 从头读 | 打开失败 |
“w | 覆盖写 | 创建新文件 |
“a” | 追加写 | 创建新文件 |
“r+” | 覆盖式可读可写 | 错误 |
“w+” | 覆盖式可读可写 | 创建新文件 |
“a+” | 追加式可读可写 | 创建新文件 |
“rb” | 从头读二进制 | 打开失败 |
“wb” | 覆盖写二进制 | 创建新文件 |
“ab” | 追加写二进制 | 创建新文件 |
“rb+” | 覆盖式可读可写二进制 | 错误 |
“wb+” | 覆盖式可读可写二进制 | 创建新文件 |
“ab+” | 追加式可读可写二进制 | 创建新文件 |
读文件
#include <stdio.h>
int main() {
// 1.打开文件FILE* fr = fopen("E:\\work\\testFile\\messfile\\23-11-6\\1.txt", "r"); //以读的方式打开文件if (fr == NULL) { //file为NULL,则打开文件失败,退出程序printf("File cannot be opened! \n");return -1;}// 2.读取内容char buf[0xFF] = { 0 };// 2.1 按字节块读取while (!feof(fr)) //没有到文件末尾{memset(buf, 0, sizeof(buf));size_t len = fread(buf, sizeof(char), sizeof(buf), fr); //每次读取sizeof(char)个字节,读取sizeof(buf)次,也可使用fscanf函数printf("buf: %s, len: %d\n", buf, len);}// 2.2 按字行读取,此方法读取中文会有bugchar* str = NULL;while (!feof(fr)) {memset(buf, 0, sizeof(buf));str = fgets(buf, sizeof(buf), fr); //fgets一次最多读取sizeof(buf)个字节,遇到换行符会停止读取printf("buf: %s \n", buf); printf("str: %s \n", str); //str 内容和buf内容相同 }// 2.3 按字符读取char c = 0;while (c != EOF){c = fgetc(fr); // 获取一个字符printf("%c", c);}printf("\n");// 3.关闭文件if (fclose(fr) != 0){printf("File cannot be closed! \n");return -1;}else{printf("File is now closed! \n");}return 0;
}
写文件
#include <stdio.h>
int main(int argc, char* argv[])
{// 1.打开文件FILE* fw = fopen("E:\\work\\testFile\\messfile\\23-11-6\\1.txt", "w"); //以读的方式打开文件if (fw == NULL) { //file为NULL,则打开文件失败,退出程序printf("File cannot be opened! \n");return -1;}// 2.写入内容char buf[128] = { 0 };// 2.1 按数据块写入char str[] = "南浦凄凄别,西凤袅袅秋。";memcpy(buf, str, strlen(str));fwrite(buf, strlen(buf) + 1, 1, fw); //每次写入strlen(buf)个字节,写入1次。可以使用fprint函数// 2.2 按行写入while (NULL != fgets(buf, sizeof(buf), stdin)) {printf("Read line with len: %d\n", strlen(buf));fputs(buf, fw);fflush(fw); //刷新输出缓冲区printf("%s", buf);}// 2.3 按字符写入char ch = getchar();while (ch != '$'){fputc(ch, fw);ch = getchar();}// 3.关闭文件if (fclose(fw) != 0){printf("File cannot be closed! \n");return -1;}else{printf("File is now closed! \n");}return 0;
}
其他操作
文件指针重定位
int fseek ( FILE * stream, long int offset, int origin );
stream:流
offset:相对应 origin 位置处的偏移量,单位为字节
origin:指针的位置
#define SEEK_CUR 1 // 当前位置
#define SEEK_END 2 // 末尾
#define SEEK_SET 0 // 开头
获取指针位置
long int ftell ( FILE * stream );
获取文件大小
long n;
fseek(pf,0,SEEK_END);
n=ftell(pf);
重命名文件
int rename ( const char * oldname, const char * newname );
oldname:原名
newname:新名
删除文件
int remove ( const char * filename );
filename:文件的完整路径
C++文件操作
打开方式 | 含义 |
---|---|
ios::in | 从头读 |
ios::out | 覆盖写 |
ios::ate | 文件指针放到尾部 |
ios::app | 追加写 |
ios::trunc | 清空内容 |
ios::binary | 二进制方式打开 |
读文件
#include <fstream>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{// 1.打开文件fstream fr;fr.open("1.txt", ios::in); //以只读模式打开文件if (!fr.is_open())std::cerr << "cannot open the file!" << endl;// 2.读取内容char buf[1024] = { 0 };// 2.1 按元素读取while (fr >> buf)cout << buf << endl; //每一次的buf是空格或回车键分开的元素// 2.2 按行取while (fr.getline(buf, sizeof(buf)))std::cout << buf << std::endl;// 2.3 按字符读取char c;while ((c = fr.get()) != EOF)std::cout << c;// 2.4常用于二进制文件读写,也可以读非二进制文件fr.read((char*)buf, sizeof(buf)); //读取到buf中,读取sizeof(buf)个字节 cout << buf;// 3.关闭文件fr.close();return 0;
}
读文件
#include <fstream>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{// 1.打开文件ofstream fw;fw.open("1.txt", ios::app); //以追加写模式打开文件if (!fw.is_open())std::cerr << "cannot open the file!" << endl;// 2.写入内容 // 2.1 直接写入fw << "心断新丰酒,销愁斗几千。" << endl;// 2.2 常用于二进制写入,也可用于普通文件写入char buf[1024] = "我未成名君未嫁,可能俱是不如人。";fw.write((char*)buf, strlen(buf));// 3.关闭文件fw.close();system("pause");return 0;
}
Windows文件操作
读文件
#include <windows.h>
int main(int argc, char* argv[])
{// 1.打开文件HANDLE hFile = CreateFile("1.txt", GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == NULL) { return -1;}// 2.读文件char buf[128] = { 0 };DWORD len = 0;DWORD dwBytesToRead = GetFileSize(hFile, NULL); //获取文件大小do { //循环读文件,确保读出完整的文件 if (!ReadFile(hFile, buf, dwBytesToRead, &len, NULL)) {cout << "read file error!" << GetLastError() << endl;return -1;}cout << buf << endl;dwBytesToRead -= len;} while (dwBytesToRead > 0);// 3.关闭文件CloseHandle(hFile);return 0;
}
写文件
int main(int argc, char* argv[])
{// 1.打开文件HANDLE hFile = CreateFile("1.txt", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == NULL) { return -1;}SetFilePointer(hFile, 0, NULL, FILE_END); //文件指针设置到文件尾,实现追加写// 2.写文件char buf[128] = { 0 };DWORD len = 0;char str[] = "劳歌一曲解行舟,红叶青山水急流,日暮酒醒人已远,满天风雨下西楼。";memcpy(buf, str, strlen(str));WriteFile(hFile, buf, strlen(buf), &len, NULL);FlushFileBuffers(hFile); //刷新缓存// 3.关闭文件CloseHandle(hFile);system("pause");return 0;
}
其他操作
复制文件
CopyFile()
删除文件/目录
deleteFiles(dir)
判断目录是否存在
#include<io.h>
if (!GetFileAttributesA(mTempDir.c_str()) & FILE_ATTRIBUTE_DIRECTORY) //mTempDir目录是否存在,不存在则创建目录resultFlag = CreateDirectory(mTempDir.c_str(), NULL);
遍历目录下的文件和目录
//文件句柄,win10用long long,win7用long就可以了
long long hFile = 0;
//文件信息
struct _finddata_t fileinfo;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) //第一次查找组合的p起来目录或文件是否存在
{do{ if ((fileinfo.attrib & _A_SUBDIR))//如果是目录,迭代之 {if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)getFiles(p.assign(path).append("\\").append(fileinfo.name), files, names);}else//如果不是,加入列表files.push_back(p.assign(path).append("\\").append(fileinfo.name));} while (_findnext(hFile, &fileinfo) == 0);_findclose(hFile);
}
ATL读写文件
#include<atlfile.h>
using namespace std;
int main(int argc, char* argv[])
{CAtlFile file;file.Create(L"1.txt", GENERIC_WRITE, 0, OPEN_EXISTING);char buf[128] = "北斗横天夜欲阑,愁人倚月思无端。";file.Seek(0, FILE_END);file.Write(buf, strlen(buf));file.Flush();return 0;
}
Linux文件操作
敬请期待