c/c++ 按照行讀取文件


本文代碼都在Windows/VC++6.0下測試過, 在linux/g++下也沒有問題。 

       但是微笑請一定注意linux和Windows文件格式的區別,比如:

       1. 當linux上的代碼讀取Windows文件格式時, 讀取結果的每行都會多一個\r,  想想為什么。

       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\n");  
  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\n");  
  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("\n");  
  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),對其它類型的文件,不適合


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM