C++快速入门——3.从另一个小程序接着说

本文介绍了C++中的文件输入输出操作,包括使用C风格文件操作函数如fopen(), 以及C++风格的文件流类ifstream和ofstream。通过示例代码详细展示了文件的打开、读取、写入等基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、文件I/O

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

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

· 例如:fileCopy sourceFile destFile

二、重点分析

· 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++的文件操作

· 为什么不先把类和对象讲清楚呢?

· 我们依旧老规矩·以实例为主,以事实说话:↓
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
    ifstream in;
    in.open( "test.txt" );
    if( !in )
    {
        cerr <<"打开文件失败"<< endl ;
        return 0;
    }
    char x;
    while( in >> x );
    {
        cout << x;
    }
    cout << endl;
    in.close();
    return 0;
}
· 从刚刚的例题我们得到的信息是C++由于有类的封装,很多东西都变得更加“仔细”了。

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

· 接着我们结合例题来说说文件的写入要用到的类ofream:↓
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
    ofstream out;
    out.open( "test.txt" );
    if(!out)
    {
        cerr <<"打开文件失败!"<<endl ;
            return 0;
    }
    for( int i=0; i < 10; i++ )
    {
        out << i;
    }
    out <<endl;
    out.close();
    return 0;
}
· 在前边两个例子中我们出现:
  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 -- 删除文件原来已存在的内容
  iosnocreate --  如果要打开的文件不存在,那么以此参数调用open函数将无法进行
  ios::noreplece -- 如果要打开的文件已存在,试图用open 函数打开时将返回一个错误

· 下面我们给出一个关于如何使用打开模式的例子:↓
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
    fstream fp("test.txt",ios::in | ios::out);
    if( !fp )
    {
        cerr <<"打开文件失败"<<endl ;
        return 0;
    }
    fp<<"fusheng";
    static char str[10];
    fp.seekg(ios::beg);
    fp >> str ;
    cout << str << endl ;
    fp.close();
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值