跳至正文
View Categories

1 min read

主要内容 #

  1. fopen
  2. freopen
  3. 复制、删除、移动文件

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。