LinuxC/C++編程(1)—文件操作

這裏以複製文件test到test1爲例,例舉了Linux編程的基本文件操作,代碼如下:

//============================================================================
// Name        : FileTest.cpp
// Author      : Lin
// Version     :
// Copyright   : Your copyright notice
// Description : File Process
//============================================================================

#include <iostream>
#include <cstdio>
#include <unistd.h>
#define BUF_SIZE 20
using namespace std;

int main()
{
	char *fromPath = "/home/lin/桌面/test";
	char *toPath = "/home/lin/桌面/test1";
	FILE *fromFile, *toFile; //FILE數據類型包含在頭文件<cstdio>中
	char buffer[BUF_SIZE];
	int rdCnt;
	int wrCnt;
	int len = 0;

	if ((fromFile = fopen(fromPath, "rt+")) < 0)   //fopen包含在頭文件<cstdio>中
	{
		cerr << "open test error!" << endl;
		return -1;
	}

	if ((toFile = fopen(toPath, "rt+")) < 0)
	{
		cerr << "open test1 error!" << endl;
		return -1;
	}

	while ((rdCnt = fread(buffer, sizeof(char), BUF_SIZE, fromFile)) > 0) //第二次fread將從第一次fread結束的位置開始,fwrite同理
	{
		if ((wrCnt = fwrite(buffer, sizeof(char), rdCnt, toFile)) != rdCnt) //這裏的第三個參數是實際讀進來的字節數
		{
			cerr << "write error!" << endl;
			return -1;
		}
		else
		{
			len += wrCnt;
			cout << len << " bytes has been write!" << endl;
		}
	}

	if (rdCnt < 0)
	{
		cerr << "read error!" << endl;
		return -1;
	}

	fclose(fromFile);
	fclose(toFile);

	cout << "success!" << endl;
	return 0;
}


程序有幾個要注意的地方:


fopen()和open()的區別:

1 fopen()是ANSI C函數,跨平臺,而open()是Linux提供的庫調用,沒事少用點。。。
2 fopen()一族的函數爲fread,fclose等,而open()組的函數爲read(),close()等

3 fopen()返回的是一個文件指針,所以fopen()一族的函數操作的是一個文件指針,而open()返回的是一個文件描述符

4 fread()fwrite()都帶緩衝,而read()write()沒有


還有一個需要注意的地方,寫Linux文本文件的時候,不能把C語言字符串最後的‘\0’寫進去,否則會造成編輯器打開文件錯誤。


順帶備註一下fopen()函數和open()函數頭文件:


定義函數#include<cstdio>
FILE * fopen(const char * path,const char * mode);


函數說明


參數path字符串包含欲打開的文件路徑及文件名,參數mode字符串則代表着流形態。
mode有下列幾種形態字符串:
r 打開只讀文件,該文件必須存在。
r+ 打開可讀寫的文件,該文件必須存在。
rb+ 讀寫打開一個二進制文件,只允許讀寫數據。
rt+ 讀寫打開一個文本文件,允許讀和寫。
w 打開只寫文件,若文件存在則文件長度清爲0,即該文件內容會消失。若文件不存在則建立該文件。
w+ 打開可讀寫文件,若文件存在則文件長度清爲零,即該文件內容會消失。若文件不存在則建立該文件。
a 以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。(EOF符保留)
a+ 以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾後,即文件原先的內容會被保留。 (原來的EOF符不保留)
wb 只寫打開或新建一個二進制文件;只允許寫數據。
wb+ 讀寫打開或建立一個二進制文件,允許讀和寫。
wt+ 讀寫打開或着建立一個文本文件;允許讀寫。
at+ 讀寫打開一個文本文件,允許讀或在文本末追加數據。
ab+ 讀寫打開一個二進制文件,允許讀或在文件末追加數據。
上述的形態字符串都可以再加一個b字符,如rb、w+b或ab+等組合,加入b 字符用來告訴函數庫打開的文件爲二進制文件,而非純文字文件。不過在POSIX系統,包含Linux都會忽略該字符。由fopen()所建立的新文件會具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)權限,此文件權限也會參考umask 值。


定義函數:#include <sys/types.h>    #include <sys/stat.h>    #include <fcntl.h>
int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);


函數說明:


參數 pathname 指向欲打開的文件路徑字符串. 下列是參數flags 所能使用的旗標:
O_RDONLY 以只讀方式打開文件
O_WRONLY 以只寫方式打開文件
O_RDWR 以可讀寫方式打開文件. 上述三種旗標是互斥的, 也就是不可同時使用, 但可與下列的旗標利用OR(|)運算符組合.
O_CREAT 若欲打開的文件不存在則自動建立該文件.如果第二個參數設置了O_CREATE則需要設置新建的文件的用戶權限,即第三個參數
參數mode 則有下列數種組合, 只有在建立新文件時纔會生效, 此外真正建文件時的權限會受到umask 值所影響, 因此該文件權限應該爲 (mode-umaks).
S_IRWXU00700 權限, 代表該文件所有者具有可讀、可寫及可執行的權限.
S_IRUSR 或S_IREAD, 00400 權限, 代表該文件所有者具有可讀取的權限.
S_IWUSR 或S_IWRITE, 00200 權限, 代表該文件所有者具有可寫入的權限.
S_IXUSR 或S_IEXEC, 00100 權限, 代表該文件所有者具有可執行的權限.
S_IRWXG 00070 權限, 代表該文件用戶組具有可讀、可寫及可執行的權限.
S_IRGRP 00040 權限, 代表該文件用戶組具有可讀的權限.
S_IWGRP 00020 權限, 代表該文件用戶組具有可寫入的權限.
S_IXGRP 00010 權限, 代表該文件用戶組具有可執行的權限.
S_IRWXO 00007 權限, 代表其他用戶具有可讀、可寫及可執行的權限.
S_IROTH 00004 權限, 代表其他用戶具有可讀的權限
S_IWOTH 00002 權限, 代表其他用戶具有可寫入的權限.
S_IXOTH 00001 權限, 代表其他用戶具有可執行的權限.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章