如何利用C/C++逐行讀取txt檔案中的字串(可以順便實現文字檔案的複製)
阿新 • • 發佈:2019-02-18
本文程式碼都在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),對其它型別的檔案,不適合。