鱼C论坛

 找回密码
 立即注册
查看: 4306|回复: 11

关于C++ Filecopy.cpp的困惑……

[复制链接]
发表于 2013-7-20 10:37:45 | 显示全部楼层 |阅读模式
10鱼币
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{
        if (argc != 3)
        {
                cerr << "Error! \n 输出样式:filecopy.exe 复制文件名称 新文件名称" << endl;
                return 0;
        }
        
        ifstream f_read (argv[1],ios::binary | ios::in);
    ofstream f_write(argv[2],ios::binary | ios::out);

        char i;

        if (f_read == NULL)
        {
      cout << "要复制的文件不存在!" << endl;
          return 0;
        }
                
        while (f_read >> i)
        {
                   f_write << i;
        }


    cout << "成功复制!" << endl;
        f_read.close();
        f_write.close();

        return 0; 
}
{:7_154:}为毛TXT中空字符(回车,空格等)复制不了……复制得到的EXE文件也会报错。大小都不一样- -


求解释……

最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-20 10:37:46 | 显示全部楼层
#include <iostream>
#include <fstream>
using namespace std;


int main(int argc, char *argv[]) 
{
        if (argc != 3) 
        {
                cerr << "Error! \n 输出样式:filecopy.exe 复制文件名称 新文件名称" << endl;
                return 0;
        }        
        ifstream f_read (argv[1],ios::binary | ios::in);
        ofstream f_write(argv[2],ios::binary | ios::out);
        char i;
        if (f_read == NULL)
        {
                cout << "要复制的文件不存在!" << endl;
                return 0;
        }               
        while (/*f_read >> i*/ f_read.read(&i,1))
        {
                //f_write << i;
                f_write.write(&i,1);
        }
    cout << "成功复制!" << endl;
        f_read.close();
        f_write.close();
        return 0; 
}
运算符>>和<<只能用于处理文本文件,既然以二进制形式打开,就要用二进制的读写函数read和write。此外,文本文件也是二进制文件,所以该程序也使用于文本文件

评分

参与人数 2荣誉 +15 鱼币 +10 贡献 +5 收起 理由
ishin + 5 感谢楼主解决大问题!
Potato丶 + 10 + 10 + 5 困惑好久……哈哈。明白了。

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-20 11:04:31 | 显示全部楼层
是不是 文件只读了啊?
或者是 TXT设置了 自动换行什么的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-20 11:08:07 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-21 01:16:59 | 显示全部楼层
{:7_154:}为毛沉了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-21 12:18:16 | 显示全部楼层
仰望天上的光 发表于 2013-7-20 10:37
运算符>>和

{:7_178:}光大,再问个问题。

怎样实现删除文本文件中某一行记录。

我尝试过自身文件读写。把要删除的行不写入。但这样貌似会造成文件内部指针混乱(就用一个文件指针)。
我又用两个文件指针。一个读。一个写。指向同一个文件。但这样也无效。好像写的那个根本不实现写入。
- -求解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-21 12:29:37 | 显示全部楼层
Potato丶 发表于 2013-7-21 12:18
光大,再问个问题。

怎样实现删除文本文件中某一行记录。

如果文件不大,把文件的所有内容都读到一个二维字符数组里(要删除的那行不读),然后把这个二维字符数组覆盖写入原文件。

如果文件很大,不适合把整个文件内容一次性存到数据结构里,那么就新建一个临时文件,每读一行,若该行不需删除,就写入临时文件。全部处理完毕后,删除源文件,再给临时文件重命名。

对于同一个文件,用两个文件指针既读又写很难操作。一是读操作和写操作间必须调用一次fseek函数,否则读写状态不能转换过来;二是因为你删除了一行的内容,就必须把此行后面所有的内容都向前移动。所以对于文件的既读又写的操作实际上更多地采用前面两种办法。

评分

参与人数 1荣誉 +10 鱼币 +10 贡献 +5 收起 理由
Potato丶 + 10 + 10 + 5 谢谢光大~

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-21 12:51:26 | 显示全部楼层
仰望天上的光 发表于 2013-7-21 12:29
如果文件不大,把文件的所有内容都读到一个二维字符数组里(要删除的那行不读),然后把这个二维字符数组 ...

{:7_158:}写入文件如此简单。要删除一行这么麻烦。
前两种方法倒是想过。只是觉得效率太低了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-27 10:21:37 | 显示全部楼层
本帖最后由 小佩 于 2017-10-27 10:24 编辑

没有使用main()函数中的参数
#include <iostream>  
#include<fstream>
#include<string>

using namespace std;  
 int main()
 {
         string infile,outfile;
         cout<<"输出格式:复制文件名称 新文件名称"<<endl;
         getline(cin,infile,'\n');
         getline(cin,outfile,'\n');
         ifstream imread(infile,ios::in);
         ofstream imwrite(outfile, ios::out);
         if(imread==NULL)
                 cout<<"打开文件失败!";
         char i;
         while(imread>>i)
                 imwrite<<i;
         cout<<"成功复制!";
         imread.close();
         imwrite.close();
 }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-6 17:26:51 | 显示全部楼层
int main(int argc, char* argv[]){


        if( argc != 3 )
    {
                cerr << "输入形式: copyFile 源文件名 目标文件名 \n" << endl;
                return 0;

    }

        ifstream in(argv[1], ios::binary|ios::in);
        if(!in){
                cerr <<"输入形式: copyFile 源文件名 目标文件名 \n" << endl;
                 return 0;
        }

        ofstream out(argv[2], ios::binary|ios::out);
        if(!out){
                cerr << "输入形式: copyFile 源文件名 目标文件名 \n" << endl;
                in.close();
                 return 0;
        }
        char x[1024];
        in.seekg(0, ios::beg);
        while(in.peek() != EOF){
                in.read((char* )&x, 1024);
                out.write((char* )&x, 1024);
        }

        in.close();
        out.close();
        cout << "成功复制!" << endl;

        return 0;
}
加了个一次读取多少字节,复制大文件,明显快很多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-2 14:24:29 | 显示全部楼层
>> 这个吃掉了换行符和空格
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-2 17:07:30 | 显示全部楼层
ooooooo
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 23:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表