本文代碼都在Windows/VC++6.0下測試過, 在linux/g++下也沒有問題。
但是請一定注意linux和Windows文件格式的區別,比如:
1. 當linux上的代碼讀取Windows文件格式時, 讀取結果的每行都會多一個\r, 想想為什么。
2. 當Windows上的代碼讀取linux格式文件時, 讀取的結果會顯示只有一行, 想想為什么。
先用C語言寫一個丑陋的程序:
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- FILE *fp;
- if(NULL == (fp = fopen("1.txt", "r")))
- {
- printf("error\n");
- exit(1);
- }
- char ch;
- while(EOF != (ch=fgetc(fp)))
- {
- printf("%c", ch);
- }
- fclose(fp);
- return 0;
- }
你只能看到結果,卻沒法利用每一行。 我們來改為:
- // VC++6.0
- #include <stdio.h>
- #include <string.h>
- int main()
- {
- char szTest[1000] = {0};
- int len = 0;
- FILE *fp = fopen("1.txt", "r");
- if(NULL == fp)
- {
- printf("failed to open dos.txt\n");
- return 1;
- }
- while(!feof(fp))
- {
- memset(szTest, 0, sizeof(szTest));
- fgets(szTest, sizeof(szTest) - 1, fp); // 包含了換行符
- printf("%s", szTest);
- }
- fclose(fp);
- printf("\n");
- return 0;
- }
這樣, 我們就是整行讀取了。
感覺C的讀取方法有點丑陋,還是看看C++吧(只要文件格式Windows/linux和編譯平台Windows/linux對應一致, 就放心用吧):
- #include <fstream>
- #include <string>
- #include <iostream>
- using namespace std;
- int main()
- {
- ifstream in("1.txt");
- string filename;
- string line;
- if(in) // 有該文件
- {
- while (getline (in, line)) // line中不包括每行的換行符
- {
- cout << line << endl;
- }
- }
- else // 沒有該文件
- {
- cout <<"no such file" << endl;
- }
- return 0;
- }
當然,你可以對上述程序進行修改,讓1.txt中的每一行輸入到2.txt中,如下:
- #include <fstream>
- #include <string>
- #include <iostream>
- using namespace std;
- int main()
- {
- ifstream in("1.txt");
- ofstream out("2.txt");
- string filename;
- string line;
- if(in) // 有該文件
- {
- while (getline (in, line)) // line中不包括每行的換行符
- {
- cout << line << endl;
- out << line << endl; // 輸入到2.txt中
- }
- }
- else // 沒有該文件
- {
- cout <<"no such file" << endl;
- }
- return 0;
- }
結果, 2.txt和1.txt中的內容完全一致,你可以用Beyond Compare比較一下,我比較過了。
看來上述程序還能實現文件的復制呢,如下:
- #include <fstream>
- #include <string>
- #include <iostream>
- using namespace std;
- void fileCopy(char *file1, char *file2)
- {
- // 最好對file1和file2進行判斷
- ifstream in(file1);
- ofstream out(file2);
- string filename;
- string line;
- while (getline (in, line))
- {
- out << line << endl;
- }
- }
- int main()
- {
- fileCopy("1.txt", "2.txt");
- return 0;
- }
當然了,上述程序只能針對文本文件(不僅僅是.txt),對其它類型的文件,不適合