从另一个小程序接着说

文件I/O

前边我们已经给大家简单介绍和演示过C和C++在终端I/O处理上的异同点。

现在我们接着来研究文件I/O。

编程任务:编写一个文件复制程序,功能实现将一个文件复制到另一个文件。

例如:fileCopy  sourceFile  destFile

C语言版实例分析:fileCopy.c

 #include <stdio.h>
#include <stdlib.h> int main( int argc, char* argv[] )
{
FILE *in, *out;
int ch; // char if( argc != )
{
fprintf( stderr, "输入形式: copyFile 源文件名 目标文件名 \n" );
exit( EXIT_FAILURE );
} if( ( in = fopen( argv[], "rb") ) == NULL )
{
fprintf( stderr, "打不开文件: %s \n", argv[] );
exit( EXIT_FAILURE );
} if( ( out = fopen( argv[], "wb") ) == NULL )
{
fprintf( stderr, "打不开文件: %s \n", argv[] );
fclose( in ); // 记得擦屁股
exit( EXIT_FAILURE );
} while( (ch = getc(in)) != EOF ) // EOF == end of file
{
if( putc( ch, out ) == EOF )
{
break;
}
} if( ferror( in ) )
{
printf("读取文件 %s 失败! \n", argv[] );
} if( ferror( out ))
{
printf("写入文件 %s 失败! \n", argv[] );
} printf("成功复制1个文件!\n"); fclose( in );
fclose( out ); return ;
}

重点分析

argc与argv[]

在程序中,main 函数有两个参数,整型变量argc和字符指针数组argv[]。

argc的含义是程序的参数数量,包含本身。

argv[]的每个指针指向命令行的一个字符串,所以argv[0]指向字符串”copyFile.exe”。

argv[1]指向字符串sourceFile,argv[2]指向字符串destFile。

in和out是我们声明的两个文件指针,它们的类型都是FILE*,分别作为两个 I/O 流对象使用。

if( argc != 3 ) 是为了确保程序参数个数的正确性。

通过fopen()函数我们以二进制的形式按可读/可写方式打开两个文件并返回两个文件指针给in和out。

为了确保文件成功打开,我们还对fopen()的返回值进行了检查,如果为成功打开,我们就向标准错误流stderr发送一条消息。

getc() 函数一次从输入流(stdin) 读取一个字符,putc() 函数把这个字符写入到输出流(stdout)。

当getc() 遇到文件结束标志的时候,函数就返回 EOF。EOF 是一个宏,在stdio.h中定义,其值为一个负整数,通常是 -1。

EOF 事实上有两个含义:MSDN

注意细节,getc() 的返回值是 int 类型哦,所以我们声明时应该是 int ch。而不是char ch。

C++的文件操作

由于我们这个C++ 的版本相对有点不同,对类和对象的应用比较多和烦,但是由于我们现在还没开始讲解类和对象,所以大家现在尽管“先用”,

例子一:example1.cpp

 #include <fstream>
#include <iostream> using namespace std; int main()
{
ifstream in; in.open( "test.txt" );
if( !in )
{
cerr << "打开文件失败" << endl;
return ;
} char x;
while( in >> x )
{
cout << x;
} cout << endl;
in.close(); return ;
}
 

从刚刚的例题我们得到的信息是C++ 由于有类的封装,很多东西都变得更加“仔细”了!

上边的例题我们用到的是文件的读取类 ifstream。

接着我们结合例题来说说文件的写入要用到的类 ofstream。

例题二:example2.cpp

 #include <fstream>
#include <iostream> using namespace std; int main()
{
ofstream out; out.open( "test.txt" );
if( !out )
{
cerr << "´ò¿ªÎļþʧ°Ü!" << endl;
return ;
} for( int i=; i < ; i++ )
{
out << i;
} out << endl;
out.close(); return ;
}

在前边两个例子中出现:

ifstream in;

in.open( “test.txt” );

ofstream out;

out.open( “test.txt” );

它们都是用一个open 函数来完成打开文件的功能。当然,这不是唯一的方法,我们还可以这样实现。

ifstream in( “test.txt” );

ofstream out( “test.txt” );

以上代码在创建一个ifstream 和ofstream 类的对象时,将文件的名字传递给它们的构造函数。

暂时我们可以这么理解构造函数:就是对象默认使用的函数(方法)。

那么这两种方法有什么区别吗?结论是没有区别!

事实上它还可以接受不止一个参数!

下边我们给出一个接受两个参数的实例:

ifstream  in( char* filename, int open_mode)

其中,filename 表示文件的名称,它是一个字符串; open_mode 表示打开模式,其值用来定义以怎样的方式打开文件(跟open的参数一样哈)。

下面给出几种常见的打开模式:

ios::in — 打开一个可读取文件

ios::out — 打开一个可写入文件

ios::binary — 以二进制的形式打开一个文件。

ios::app — 写入的所有数据将被追加到文件的末尾

ios::trunk — 删除文件原来已存在的内容

ios::nocreate — 如果要打开的文件并不存在,那么以此参数调用open 函数将无法进行。

ios::noreplece — 如果要打开的文件已存在,试图用open 函数打开时将返回一个错误。

下边给出一个关于如何使用打开模式的例子。

例子三:example3.cpp

 #include <fstream>
#include <iostream> using namespace std; int main()
{
ofstream out( "test.txt", ios::app ); if( !out )
{
cerr << "打开文件失败!" << endl;
return ;
} for( int i=; i > ; i-- )
{
out << i;
} out << endl;
out.close(); return ;
}

如果我需要的不只是一种打开模式,要多种并存怎么办呢?

我们只需要使用 OR 操作符:“|”

 #include <fstream>
#include <iostream> using namespace std; int main()
{
fstream fp("test.txt", ios::in | ios::out );
if( !fp )
{
cerr << "打开文件失败!"<< endl;
return ;
} fp << "IloveFishc.com!"; static char str[]; fp.seekg(ios::beg); //// 使得文件指针指向文件头 ios::end 则是文件尾。
fp >> str;
cout << str << endl; fp.close(); return ;
}

c++学习笔记---04---从另一个小程序接着说的更多相关文章

  1. C++笔记003:从一个小程序开始

      原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 安装好VS2010后,从第一个小程序开始. 在学习C语言时,我首先输出了一个程序员非常熟悉的对这个世界的问候:hello world! ...

  2. Android学习笔记一之第一个Android程序

    /** *Title:总结昨天下午至今天上午的学习成果 *Author:zsg *Date:2017-8-13 / 一.了解Android 1.Android架构 Android大致可分为四层架构:L ...

  3. Lua学习笔记 入门的两个小程序

    [Hello World]第一个Lua程序将遵循传统做法,打印一句“Hello World”: print("Hello World") [阶乘]下面的程序用于输出输入值对应的阶乘 ...

  4. Python学习笔记一:第一个Python程序,变量,字符编码与二进制,用户交互程序

    第一个python程序 Windows:设置环境变量,X:\pthonxxx,xxx是版本号 在命令提示符下 输入python,进入解释器 >>>print(“Hello World ...

  5. 微信小程序学习笔记(1)-微信小程序样式设置逻辑

    1.微信小程序的样式设置统一在每一页的.wxss的样式文件中,所有的样式设置代码统一写入这个文件中: 2.样式主要是通过.wxml里面控件的“class”属性来调用,此处调用会有几个细节要注意: 1) ...

  6. 学习笔记--我的第一个Java程序

    我的第一个Java程序 // pubilc 表示公开的 // class 表示定义一个类 // HelloWorld 表示一个类名 public class HelloWorld { // 表示定义一 ...

  7. pythonweb框架Flask学习笔记02-一个简单的小程序

    #-*- coding:utf-8 -*- #导入了Flask类 这个类的实例将会是我们的WSGI应用程序 from flask import Flask #创建一个Flask类的实例 第一个参数是应 ...

  8. Django学习笔记(一):第一个django程序

    1.创建和运行 django-admin startproject xxx python manage.py runserver 2.第一个项目程序 wsgi.py中文名:python服务器网关接口. ...

  9. c++学习笔记---03---从一个小程序说起2

    从一个小程序说起2 要求:编写一个程序,要求用户输入一串整数和任意数目的空格,这些整数必须位于同一行中,但允许出现在该行中的任何位置.当用户按下键盘上的"Enter"键时,数据输入 ...

随机推荐

  1. JAVA基础---编码解码

    所谓编码 即char->byte 所谓解码 即byte->char ISO-8859-1 中文字符会被黑洞吸收 全部变为"?" GB2312 汉字可以被编码为双字节 但 ...

  2. JAVA设计模式总结之六大设计原则

    从今年的七月份开始学习设计模式到9月底,设计模式全部学完了,在学习期间,总共过了两篇:第一篇看完设计模式后,感觉只是脑子里面有印象但无法言语.于是决定在看一篇,到9月份第二篇设计模式总于看完了,这一篇 ...

  3. Linux学习——shell编程之环境变量配置文件

    小白学习,在学习中总结! shell编程之环境变量配置文件 一:环境变量配置文件 1 shell编程之环境变量配置 变量类型: 用户自定义变量(本地变量) 环境变量 :定义每个用户的操作环境,如pat ...

  4. OpenCV探索之路(二十五):制作简易的图像标注小工具

    搞图像深度学习的童鞋一定碰过图像数据标注的东西,当我们训练网络时需要训练集数据,但在网上又没有找到自己想要的数据集,这时候就考虑自己制作自己的数据集了,这时就需要对图像进行标注.图像标注是件很枯燥又很 ...

  5. 创建 Rex-Ray volume - 每天5分钟玩转 Docker 容器技术(76)

    前面我们安装部署了 Rex-Ray,并且成功配置 VirtualBox backend,今天演示如何创建和使用 Rex-Ray volume. 在 docker1 或 docker2 上执行如下命令创 ...

  6. hdu1754线段树的单点更新区间查询

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  7. MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据

    记录通过.frm和.ibd文件恢复数据到本地 .frm文件:保存了每个表的元数据,包括表结构的定义等: .ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per ...

  8. C# JAVA成员访问修饰符比较

    在面向对象的访问修饰符中常用的有public ,private ,protected C# 访问修饰符: private < protected internal < internal/p ...

  9. 由 System.arraycopy 引发的巩固:对象引用 与 对象 的区别

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  10. List之Union(),Intersect(),Except() 即并集,交集,差集运算。

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...