本文代码都在Windows/VC++6.0下测试过, 在linux/g++下也没有问题。

但是请一定注意linux和Windows文件格式的区别,比如:

1. 当linux上的代码读取Windows文件格式时, 读取结果的每行都会多一个\r,  想想为什么。

2. 当Windows上的代码读取linux格式文件时, 读取的结果会显示只有一行, 想想为什么。

先用C语言写一个丑陋的程序:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. FILE *fp;
  6. if(NULL == (fp = fopen("1.txt", "r")))
  7. {
  8. printf("error\n");
  9. exit(1);
  10. }
  11. char ch;
  12. while(EOF != (ch=fgetc(fp)))
  13. {
  14. printf("%c", ch);
  15. }
  16. fclose(fp);
  17. return 0;
  18. }

你只能看到结果,却没法利用每一行。 我们来改为:

  1. // VC++6.0
  2. #include <stdio.h>
  3. #include <string.h>
  4. int main()
  5. {
  6. char szTest[1000] = {0};
  7. int len = 0;
  8. FILE *fp = fopen("1.txt", "r");
  9. if(NULL == fp)
  10. {
  11. printf("failed to open dos.txt\n");
  12. return 1;
  13. }
  14. while(!feof(fp))
  15. {
  16. memset(szTest, 0, sizeof(szTest));
  17. fgets(szTest, sizeof(szTest) - 1, fp); // 包含了换行符
  18. printf("%s", szTest);
  19. }
  20. fclose(fp);
  21. printf("\n");
  22. return 0;
  23. }

这样, 我们就是整行读取了。

感觉C的读取方法有点丑陋,还是看看C++吧(只要文件格式Windows/linux和编译平台Windows/linux对应一致, 就放心用吧):

  1. #include <fstream>
  2. #include <string>
  3. #include <iostream>
  4. using namespace std;
  5. int main()
  6. {
  7. ifstream in("1.txt");
  8. string filename;
  9. string line;
  10. if(in) // 有该文件
  11. {
  12. while (getline (in, line)) // line中不包括每行的换行符
  13. {
  14. cout << line << endl;
  15. }
  16. }
  17. else // 没有该文件
  18. {
  19. cout <<"no such file" << endl;
  20. }
  21. return 0;
  22. }

当然,你可以对上述程序进行修改,让1.txt中的每一行输入到2.txt中,如下:

  1. #include <fstream>
  2. #include <string>
  3. #include <iostream>
  4. using namespace std;
  5. int main()
  6. {
  7. ifstream in("1.txt");
  8. ofstream out("2.txt");
  9. string filename;
  10. string line;
  11. if(in) // 有该文件
  12. {
  13. while (getline (in, line)) // line中不包括每行的换行符
  14. {
  15. cout << line << endl;
  16. out << line << endl; // 输入到2.txt中
  17. }
  18. }
  19. else // 没有该文件
  20. {
  21. cout <<"no such file" << endl;
  22. }
  23. return 0;
  24. }

结果, 2.txt和1.txt中的内容完全一致,你可以用Beyond Compare比较一下,我比较过了。

看来上述程序还能实现文件的复制呢,如下:

  1. #include <fstream>
  2. #include <string>
  3. #include <iostream>
  4. using namespace std;
  5. void fileCopy(char *file1, char *file2)
  6. {
  7. // 最好对file1和file2进行判断
  8. ifstream in(file1);
  9. ofstream out(file2);
  10. string filename;
  11. string line;
  12. while (getline (in, line))
  13. {
  14. out << line << endl;
  15. }
  16. }
  17. int main()
  18. {
  19. fileCopy("1.txt", "2.txt");
  20. return 0;
  21. }

当然了,上述程序只能针对文本文件(不仅仅是.txt),对其它类型的文件,不适合

c/c++ 按照行读取文件的更多相关文章

  1. C++/Php/Python/Shell 程序按行读取文件或者控制台

    写程序经常需要用到从文件或者标准输入中按行读取信息,这里汇总一下.方便使用 1. C++ 读取文件 #include<stdio.h> #include<string.h> i ...

  2. Python跳过第一行读取文件内容

    Python编程时,经常需要跳过第一行读取文件内容.比较容易想到是为每行设置一个line_num,然后判断line_num是否为1,如果不等于1,则进行读取操作.相应的Python代码如下: inpu ...

  3. python_基础学习_01_按行读取文件的最优方法

    python 按行读取文件 ,网上搜集有N种方法,效率有区别,先mark最优答案,下次补充测试数据 with open('filename') as file: for line in file: d ...

  4. Java利用内存映射文件实现按行读取文件

    我们知道内存映射文件读取是各种读取方式中速度最快的,但是内存映射文件读取的API里没有提供按行读取的方法,需要自己实现.下面就是我利用内存映射文件实现按行读取文件的方法,如有错误之处请指出,或者有更好 ...

  5. python 按每行读取文件怎么去掉换行符

    python按每行读取文件后,会在每行末尾带上换行符,这样非常不方便后续业务处理逻辑,需要去掉每行的换行符,怎么去掉呢?看下面的案例: >>> a = "hello wor ...

  6. Shell按行读取文件的3种方法

    Shell按行读取文件的方法有很多,常见的三种方法如下: 要读取的文件: [root@mini05 -]# cat file.info 写法一: [root@mini05 -]# cat read1. ...

  7. Python按行读取文件、写文件

    Python按行读取文件 学习了:https://www.cnblogs.com/scse11061160/p/5605190.html file = open("sample.txt&qu ...

  8. shell脚本,按行读取文件的几种方法。

    第一种方法用while实现按读取文件.[root@localhost wyb]# cat a.txt 第一行 aaaaaa 第二行 bbbbbb 第三行 cccccc 第四行 dddddd 第五行 e ...

  9. C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结。

    C++/Php/Python/Shell 程序按行读取文件或者控制台方法总结. 一.总结 C++/Php/Python/Shell 程序按行读取文件或者控制台(php读取标准输入:$fp = fope ...

  10. C++ 按行读取文件并打印

    #include<iostream> #include<fstream> #include<string> #include <vector> #inc ...

随机推荐

  1. Vue.js 项目开发学习路线图

    1. 思维导图 源文件:Vue路线图.xmind 参考文献 [1]. VueJs2.0建议学习路线 - lavyun - 博客园 [2]. Vue学习路线图 - 个人文章 - SegmentFault ...

  2. [前后端分离项目]thinkphp返回给前端数据为字符串

    写在前面:现在项目大多是采用前后端分离的模式进行开发,这种模式下的开发大大的提高了工作效率,而进行前后端数据交互传输的格式基本以json为主,毕业设计中兼顾前端开发和后端开发(后端小白一个),前端业务 ...

  3. U盘拷贝大文件提示文件过大无法拷贝解决方案

    工具: 计算机 windows操作系统 U盘 原因:由于U盘的格式问题导致的,当期的磁盘格式是FAT32类型的,无拷贝过大的文件 方法:接下来修改U盘类型,且不格式化U盘 1.键盘win+R快捷键弹出 ...

  4. ionic3打包打包安卓apk详细过程以及遇到的问题

    1.jdk和sdk的安装以及环境变量配置参考打包详解 上述连接已经从下载安装jdk以及sdk的环境变量配置到打包的流程以及很详细了.但是在我自己安装打包的过程中遇到了这篇文章中没有遇到的问题,下面图文 ...

  5. 那些H5用到的技术(1)——素材加载

    编码环境前言什么时候用到素材加载?loading提示,让用户等待图片的加载音频的加载利用神器PreloadJS总结 编码环境 Sublime Text 3 插件包括: Autoprefixer 自动补 ...

  6. Cloudera Manager安装之Cloudera Manager 5.6.X安装(tar方式、rpm方式和yum方式) (Ubuntu14.04) (三)

    见 Ubuntu14.04下完美安装cloudermanage多种方式(图文详解)(博主推荐) 欢迎大家,加入我的微信公众号:大数据躺过的坑     免费给分享       同时,大家可以关注我的个人 ...

  7. Spark standalone简介与运行wordcount(master、slave1和slave2)

    前期博客 Spark standalone模式的安装(spark-1.6.1-bin-hadoop2.6.tgz)(master.slave1和slave2)  Spark运行模式概述 1. Stan ...

  8. ZOJ 2856 Happy Life

    Problem Description Do you know Utopia? It's a perfect world in which everyone leads a happy life. A ...

  9. Guava学习笔记:Optional优雅的使用null

    在我们学习和使用Guava的Optional之前,我们需要来了解一下Java中null.因为,只有我们深入的了解了null的相关知识,我们才能更加深入体会领悟到Guava的Optional设计和使用上 ...

  10. Eclipse/MyEclipse 选择Android NDK目录时提示“Not a valid NDK directory”

    Eclipse或者MyEclipse 选择Android NDK目录时提示“Not a valid NDK directory” 在NDK目录中新建一个名称 ndk-build (没有扩展名)的空文件