写在前面:作为一只小白,感谢小甲鱼老师提供这么好的入门课程。因此在这里做个笔记,如有侵权请联系删除
www.fishc.com
https://blog.csdn.net/qq_30708445/article/details/88596720
文件I/O
编程任务:编写一个文件复制程序,功能实现将一个文件复制到另一个文件
例如:fileCopy sourceFile destFile
c语言实现
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
FILE *in, *out;
int ch;
if (argc !=3)
{
fprintf(stderr, "输入形式:copyFile 源文件名 目标文件名 \n");
exit(EXIT_FAILURE);
}
if ((in = fopen(argv[1], "rb")) == NULL)
{
fprintf(stderr, "打不开文件: %s \n", argv[2]);
fclose(in);
exit(EXIT_FAILURE);
}
while ((ch = getc(in) != EOF)
{
if (putc(ch, out) == EOF)
{
break;
}
}
if (ferror(in))
{
fprintf("读取文件 %s 失败! \n", argv[1]);
}
if (ferror(out))
{
fprintf("写入文件 %s 失败! \n", argv[2]);
}
printf("成功复制1个文件! \n");
floce(in);
fclose(out);
return 0;
}
重点分析
1、argc和argv[]
在程序中,main函数有两个参数,整型变量argc和字符指针数组argv[],argc的含义是程序的参数数量,包括本身。
argv[]的每个指针指向命令行的一个字符串,所以argv[0]指向字符串"copyFile.exe",argv[1]指向字符串sourceFile, argv[2]
指向字符串destFile.
2、in和out是我们声明的两个文件指针,它们的类型都是FILE*,分别作为两个I/O流对象使用
3、getc()函数一次从输入流(stdin)读取一个字符,putc()函数把这个字符写入到输出流(stdout),当getc()遇到文件结束标志的时候,函数就返回EOF, EOF是一个宏,在stdio.h中定义, 其值为一个负整数,通常是-1. getc()的返回值是int类型,因此在声明时应该是int ch.
C++版本
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream in; //定义成了in对象
in.open("test.txt");
if (!in)
{
cerr << "打开文件失败" << endl;
return 0;
}
char x;
while (in >> x)
{
cout << x;
}
cout << endl;
in.close();
return 0;
}
重点分析
1、文件读取类ifstream,写入类ofstream
ifstream in;
in.open("test.txt");
和
ofstream out;
out.open("test.txt");
或者如下
ifstream in("test.txt");
和
ofstream out("test.txt");
以上代码在创建一个ifstream和ofstream类的对象时,将文件的名字传递给它们的构造函数
下面给出一个接受两个参数的实例:
ifstream in(char* filename, int open_mode)
几种常见的打开模式(open_mode):
ios::in 打开一个可读取文件
ios::out 打开一个可写入文件
ios::binary 以二进制的形式打开一个文件
ios::app 写入的所有数据讲被追加到文件的末尾 append
ios::trunk 删除文件原来已存在的内容
ios::nocreate 如果要打开的文件并不存在,那么以此参数调用open函数将无法进行
例子
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ofstream out("test.txt", ios::app);
//ofstream out("test.txt", ios::app | ios::out); //多种打开模式共存
if (!out)
{
cerr << "打开文件失败" << endl;
return 0;
}
for (int i=10; i>0; i--)
{
out << i;
}
out << endl;
out.close();
return 0;
}
如果多种打开模式并存呢?
ios::app | ios::out
课后作业
用c++实现fileCopy