1. 程式人生 > >如何利用C/C++逐行讀取txt檔案中的字串(可以順便實現文字檔案的複製)

如何利用C/C++逐行讀取txt檔案中的字串(可以順便實現文字檔案的複製)

       本文程式碼都在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),對其它型別的檔案,不適合。