主要内容 #
- fopen
- freopen
- 复制、删除、移动文件
C++语言提供了用于文件操作的标准函数。本节将介绍函数freopen和fopen,它们均包含在标准库cstdio中。文件操作的基本步骤如下:
(1)打开文件;
(2)进行读或者写操作;
(3)使用完文件后关闭文件。
1. fopen #
使用给定的模式 mode 打开 filename 所指向的文件。
1.1 fopen()的声明 #
FILE *fopen(const char *filename, const char *mode)
参数:
filename ——这是字符串,表示要打开的文件名称。
mode ——表示文件的访问模式,具体的模式如下表所示:
1.2 返回值 #
该函数返回一个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。
1.3 实例 #
#include < stdio.h > #include < stdlib.h > int main() { FILE * fp; fp = fopen ("file.txt", "w+"); fprintf(fp, "%s %s %s %d", "We", "are", "in", 2014); fclose(fp); return(0); }
编译并运行上面的程序,这将创建一个带有一下内容的文件 file.txt:
We are in 2014
使用下面的程序查看上面文件的内容:
#include < stdio.h > int main () { FILE *fp; int c; fp = fopen("file.txt","r"); while(1) { c = fgetc(fp); if( feof(fp) ) { break ; } printf("%c", c); } fclose(fp); return(0); }
2. freopen #
FILE *freopen(const char *filename, const char *mode, FILE *stream) 把一个新的文件名 filename 与给定的打开的流 stream 关联,同时关闭流中的旧文件。
2.1 freopen()的声明 #
FILE *freopen(const char *filename, const char *mode, FILE *stream)
参数:
filename ——这是字符串,表示要打开的文件名称。
mode ——表示文件的访问模式,与fopen()相同。
stream ——这是指向 FILE 对象的指针,该 FILE 对象标识了要被重新打开的流。
stdin:标准输入流,默认是键盘。
stdout:标准输入流,默认是键盘。
stderr:标准错误流,默认是屏幕。
2.2 返回值 #
如果文件成功打开,则函数返回一个指针,指向用于标识流的对象。否则,返回空指针。
2.3 实例 #
#include < stdio.h > int main () { FILE *fp; printf("该文本重定向到 stdout\n"); fp = freopen("file.txt", "w+", stdout); printf("该文本重定向到 file.txt\n"); fclose(fp); return(0); }
运行上面的程序,这将发送下列行到标准输出 STDOUT,因为起初我们并没有打开标准输出:
该文本重定向到 stdout
在调用 freopen() 之后,它会关联标准输出 STDOUT 到文件 file.txt,无论我们在标准输出 STDOUT 中写了什么都会被写入 file.txt,所以文件 file.txt 将有以下内容:
该文本重定向到 file.txt
使用下面的程序查看上面文件的内容:
#include < stdio.h > int main () { FILE *fp; int c; fp = fopen("file.txt","r"); while(1) { c = fgetc(fp); if( feof(fp) ) { break ; } printf("%c", c); } fclose(fp); return(0); }
3. 复制、删除文件 #
3.1 复制文件 #
CopyFile函数定义在Windows.h中,使用时要include之;
CopyFile()使用如下:
#include<Windows.h> int main() { CopyFile("C:\\a.txt","C:\\b.txt",FALSE); }
便可将a.txt文件复制到b.txt文件,第三个参数表示: 如果目标已经存在,不拷贝(True)并返回False,覆盖目标(false)。
3.2 删除文件 #
要使用C++ 删除文件,需要使用int remove(const char * filename);方法,filename为要删除的文件名,可以为一目录。如果参数filename 为一文件,则调用unlink()处理;若参数filename 为一目录,则调用rmdir()来处理。删除成功则返回0,失败则返回-1,错误原因存于errno。C++中头文件是#include <cstdio>。
#include<iostream> #include<cstdio> #include <string.h> using namespace std; int main() { char *savePath = "/home/cjavapy/hello.txt"; if(remove(savePath)==0) { cout<<"删除成功"<<endl; } else { cout<<"删除失败"<<endl; } //输出错误信息 cout << strerror(errno); return 0; }
错误代码:
1)EROFS 欲写入的文件为只读文件。
2)EFAULT 参数filename 指针超出可存取内存空间。
3)ENAMETOOLONG 参数filename 太长。
4)ENOMEM 核心内存不足。
5)ELOOP 参数filename 有过多符号连接问题。
6)EIO I/O存取错误。
3.3 移动文件 #
MoveFile(A, B);表示将文件A移动到B
#include <fstream> #include <windows.h> int main() { char *fn = "test.txt"; std::ofstream out(fn); if (!out.is_open()) return 0; out.close(); WCHAR buf[256]; memset(buf, 0, sizeof(buf)); MultiByteToWideChar(CP_ACP, 0, fn, strlen(fn) + 1, buf, sizeof(buf) / sizeof(buf[0])); MoveFile(buf, L"../file/output.txt");//FALSE:将前者移动到后者中(后者路径若不错在,return 0) system("pause"); return 1; }
由函数原型可以看出,这两个函数的前两个输入参数都为LRCWSTR类型,如果我们定义的是char*,记得转换成LRCWSTR,否则会报错;
另外,这两个函数都返回一个bool型变量,表示执行成功与否,当目标位置路径不存在时,会return 0。