主要内容 #
- 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。