zoukankan      html  css  js  c++  java
  • c/c++ 按照行读取文件

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

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

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

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

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

    [cpp] view plain copy
     
    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 ");  
    9.         exit(1);  
    10.     }  
    11.   
    12.     char ch;  
    13.     while(EOF != (ch=fgetc(fp)))  
    14.     {  
    15.         printf("%c", ch);  
    16.     }  
    17.   
    18.     fclose(fp);  
    19.   
    20.     return 0;  
    21. }  

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

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    MySQL数据库学习【第三篇】增删改查操作
    MySQL数据库学习【第二篇】基本操作和存储引擎
    MySQL数据库学习【第一篇】数据库安装
    python全栈开发基础【第二十七篇】IO模型
    python全栈开发基础【第二十六篇】(concurrent.futures模块、协程、Greenlet、Gevent)
    python基础之带参数装饰器和迭代器
    python基础之闭包函数与装饰器
    逻辑回归
    朴素贝叶斯
    决策树
  • 原文地址:https://www.cnblogs.com/whwywzhj/p/8484001.html
Copyright © 2011-2022 走看看