鱼C论坛

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

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

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

  3. using namespace std;

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

  14.         char i;

  15.         if (f_read == NULL)
  16.         {
  17.       cout << "要复制的文件不存在!" << endl;
  18.           return 0;
  19.         }
  20.                
  21.         while (f_read >> i)
  22.         {
  23.                    f_write << i;
  24.         }


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

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


求解释……

最佳答案

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

使用道具 举报

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


  4. int main(int argc, char *argv[])
  5. {
  6.         if (argc != 3)
  7.         {
  8.                 cerr << "Error! \n 输出样式:filecopy.exe 复制文件名称 新文件名称" << endl;
  9.                 return 0;
  10.         }        
  11.         ifstream f_read (argv[1],ios::binary | ios::in);
  12.         ofstream f_write(argv[2],ios::binary | ios::out);
  13.         char i;
  14.         if (f_read == NULL)
  15.         {
  16.                 cout << "要复制的文件不存在!" << endl;
  17.                 return 0;
  18.         }               
  19.         while (/*f_read >> i*/ f_read.read(&i,1))
  20.         {
  21.                 //f_write << i;
  22.                 f_write.write(&i,1);
  23.         }
  24.     cout << "成功复制!" << endl;
  25.         f_read.close();
  26.         f_write.close();
  27.         return 0;
  28. }
复制代码
运算符>>和<<只能用于处理文本文件,既然以二进制形式打开,就要用二进制的读写函数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()函数中的参数
  1. #include <iostream>  
  2. #include<fstream>
  3. #include<string>

  4. using namespace std;  
  5. int main()
  6. {
  7.          string infile,outfile;
  8.          cout<<"输出格式:复制文件名称 新文件名称"<<endl;
  9.          getline(cin,infile,'\n');
  10.          getline(cin,outfile,'\n');
  11.          ifstream imread(infile,ios::in);
  12.          ofstream imwrite(outfile, ios::out);
  13.          if(imread==NULL)
  14.                  cout<<"打开文件失败!";
  15.          char i;
  16.          while(imread>>i)
  17.                  imwrite<<i;
  18.          cout<<"成功复制!";
  19.          imread.close();
  20.          imwrite.close();
  21. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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


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

  6.     }

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

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

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

  27.         return 0;
  28. }
复制代码

加了个一次读取多少字节,复制大文件,明显快很多
想知道小甲鱼最近在做啥?请访问 -> 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, 2024-3-29 18:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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