輸入和輸出格式:


c++中輸出和輸入導屏幕和鍵盤的類別聲明包含再標題文件<iostrream.h>中,而磁盤類文件的 I/O則聲明再包含標題文件<fstream.h>內。

輸入和輸出格式:

輸出到磁盤 ofsteam 識別字(“文件名”)

從磁盤讀文件 ifsteam 識別字("文件名“)

例如:

ofstream outfile("data.txt"); //寫入到磁盤的data.txt中

格式化輸入輸出:

1 整數數據的輸入輸出

整數數據存儲再磁盤內,每個文字各占一個字節。

例如:

#include <fstream.h>

#include <iostream.h>

#inlude <conio.h>

void main()

{

ofstream outfile("data.txt"); //寫入文件

for(int i=0;i<10;i++)

outfile<<i<<" "; //空格是為了避免數值連接在一起加上去的,此文件大小為20字節

cout<<"ok,press a key!";

gerch();
}

程序執行后用記事本打開可以看到數據

0 1 2 3 4 5 6 7 8 9

同樣讀取文件語句為:

int data;

ifstream infile("data.txt");

for(int i=0;i<10;i++)

{

infile>>data ; //讀數據的時候因為數據間有一個空格才能完整的讀出,

cout<<data<<" "; //輸出到屏幕,加上空格是為了分開數字

}

2 字符數據的輸入

字符的輸出方式以put(ch)為存入語句,讀取語句為get(ch)

例如:

char str[]="hello this is a c++ programe!\n"

"i know this difference \n"

"and mocive";

ofstream outfile ("data.txt");

for(int i=0;i<strlen(Str);i++)

outfile.put(str[i]);

讀取:

char ch;

ifstream infile("data.txt");

while(infile)

{

infile.get(ch);

cout<<ch;

}

getch();

}

3 字符串數據的輸入

數據多的時候讀寫速度比較快,輸入時以整行字符串加上換行符號一次寫入。讀取的時候以語句getline(buffer,max),來讀取整行數據,直到遇到換行符,每行結尾的\n並不讀入,所以在 輸出的時候需要加上換行符號,否則數據會連接在一起。

例子:

ofstream outfile("strdata.txt");

outfile<<"use your vote\n";

outfile<<"ouse your weise\n";

讀取:

const MAX=80;

char buffer[MAX];

ifstream infile("strdata.txt");

while(infile)

{

infile.getline(buffer,MAX);

cout<<buffer<<endl;

}

4 浮點數

浮點數因為有小數點,在存儲數據時與整數相同,只要每個數據加上一個空格就可以區隔相鄰的數據

6 二進制文件

上述的格式化文件比較占用硬盤控件,采用二進制存儲就可以節約很多控件。它使用write,read()來存儲和讀取。

ofstream 識別字(”文件名“,ios::binary);

write( 寫入地址,寫入大小)

ifstream 識別字(”文件名“,ios:binary);

識別字.read(讀取地址,讀取大小);

例如:infile.read((char*)buffer,sizeof(數據類型));

關閉文件

識別字.close();

例子:

ofstream outfile("data.dat",ios::binary);

for(int i=0;i<100;i++)

{

n[0]=i+1;

outfile.write((Char*)n,sizeof(int)); //還可以用變量和數組為例

// outfile.write((Char*)&i,sizeof(int)); i 為變量

// outfile.write((Char*)n,sizeof(int)); n為數組

}

outfile.close();

ifstream inifile("data.dat",ios:binary);

for(i=0;i<100;i++)

{ inifile.read((Char*)n,sizeof(int);

cout<<n[0]<<" ";

}

7 隨機存取文件

文件能夠隨意讀出,讀出后又可以更新,更新后可以回存到源文件內。fstream file ;

file.open("文件名",存取模式);

file.open("x.dat",ios::app|ios::in|ios::out|ios::binary);

in 打開文件輸入或者讀取 ifstream

out 打開文件輸出或者寫入 ofstream

ate 從文件尾開始寫入或者讀取

app 加在文件尾

arunc 若文件存在,講其長度設為0

binary 打開二進制文件

二進制文件中有一個指針,指向當前數據在文件中的位置,這個文件指針和一般的指針變量不一樣,它只是一個純粹的指示器。

函數介紹

seekg()

seekg(0) 指針移到文件的最前面

seekg(0,ios::cur);把當前的指針當作0

seekg(0,ios::end);將指針移到文件尾,若再配合file.tellg()則可以求出文件的大小為多少bytes

以下兩個操作都必須在文件關閉后才可以使用

remove("文件名”);把這個文件刪除

rename("舊文件名","新文件名");

#include<iostream>
#include
<fstream>
using namespace std;

int main()
{
int n[5]= {1,2, 3,4, 5};
register
int i;

ofstream out(
"test", ios::out | ios::binary);
if(!out) {
cout
<< "Cannot open file.\n";
return
1;
}

out.write((char
*) &n, sizeof n);

out.close();

for(i = 0; i<5; i++)// clear array
n[i]
= 0;

ifstream in(
"test", ios::in | ios::binary);
if(!in) {
cout
<< "Cannot open file.\n";
return
1;
}

in.read((char
*) &n, sizeof n);

for(i = 0; i<5; i++)// show values read from file
cout
<< n[i] << "";

in.close();

return
0;
}


posted on 2007-06-14 13:23 聶文龍 閱讀(35847) 評論(2) 編輯 收藏引用 所屬分類:c++

FeedBack: #re: ofstream ifstream 文件操作 2007-06-14 13:24 聶文龍  在C++中,有一個stream這個類,所有的I/O都以這個“流”類為基礎的,包括我們要認識的文件I/O,stream這個類有兩個重要的運算符:

1、插入器(<<)
  向流輸出數據。比如說系統有一個默認的標准輸出流(cout),一般情況下就是指的顯示器,所以,cout<<"Write Stdout"<<'n';就表示把字符串"Write Stdout"和換行字符('n')輸出到標准輸出流。

2、析取器(>>)
  從流中輸入數據。比如說系統有一個默認的標准輸入流(cin),一般情況下就是指的鍵盤,所以,cin>>x;就表示從標准輸入流中讀取一個指定類型(即變量x的類型)的數據。

  在C++中,對文件的操作是通過stream的子類fstream(file stream)來實現的,所以,要用這種方式操作文件,就必須加入頭文件fstream.h。下面就把此類的文件操作過程一一道來。

一、打開文件
  在fstream類中,有一個成員函數open(),就是用來打開文件的,其原型是:

void open(const char* filename,int mode,int access);

參數:

filename:  要打開的文件名
mode:    要打開文件的方式
access:   打開文件的屬性
打開文件的方式在類ios(是所有流式I/O類的基類)中定義,常用的值如下:

ios::app:   以追加的方式打開文件
ios::ate:   文件打開后定位到文件尾,ios:app就包含有此屬性
ios::binary:  以二進制方式打開文件,缺省的方式是文本方式。兩種方式的區別見前文
ios::in:    文件以輸入方式打開
ios::out:   文件以輸出方式打開
ios::nocreate: 不建立文件,所以文件不存在時打開失敗 
ios::noreplace:不覆蓋文件,所以打開文件時如果文件存在失敗
ios::trunc:  如果文件存在,把文件長度設為0
  可以用“或”把以上屬性連接起來,如ios::out|ios::binary

  打開文件的屬性取值是:

0:普通文件,打開訪問
1:只讀文件
2:隱含文件
4:系統文件
  可以用“或”或者“+”把以上屬性連接起來 ,如3或1|2就是以只讀和隱含屬性打開文件。

  例如:以二進制輸入方式打開文件c:config.sys

  fstream file1;
  file1.open("c:config.sys",ios::binary|ios::in,0);

  如果open函數只有文件名一個參數,則是以讀/寫普通文件打開,即:

  file1.open("c:config.sys");<=>file1.open("c:config.sys",ios::in|ios::out,0);

  另外,fstream還有和open()一樣的構造函數,對於上例,在定義的時侯就可以打開文件了:

  fstream file1("c:config.sys");

  特別提出的是,fstream有兩個子類:ifstream(input file stream)和ofstream(outpu file stream),ifstream默認以輸入方式打開文件,而ofstream默認以輸出方式打開文件。

  ifstream file2("c:pdos.def");//以輸入方式打開文件
  ofstream file3("c:x.123");//以輸出方式打開文件

  所以,在實際應用中,根據需要的不同,選擇不同的類來定義:如果想以輸入方式打開,就用ifstream來定義;如果想以輸出方式打開,就用ofstream來定義;如果想以輸入/輸出方式來打開,就用fstream來定義。

二、關閉文件
  打開的文件使用完成后一定要關閉,fstream提供了成員函數close()來完成此操作,如:file1.close();就把file1相連的文件關閉。

三、讀寫文件
  讀寫文件分為文本文件和二進制文件的讀取,對於文本文件的讀取比較簡單,用插入器和析取器就可以了;而對於二進制的讀取就要復雜些,下要就詳細的介紹這兩種方式

  1、文本文件的讀寫
  文本文件的讀寫很簡單:用插入器(<<)向文件輸出;用析取器(>>)從文件輸入。假設file1是以輸入方式打開,file2以輸出打開。示例如下:

  file2<<"I Love You";//向文件寫入字符串"I Love You"
  int i;
  file1>>i;//從文件輸入一個整數值。

  這種方式還有一種簡單的格式化能力,比如可以指定輸出為16進制等等,具體的格式有以下一些

操縱符 功能 輸入/輸出
dec 格式化為十進制數值數據 輸入和輸出
endl 輸出一個換行符並刷新此流 輸出
ends 輸出一個空字符 輸出
hex 格式化為十六進制數值數據 輸入和輸出
oct 格式化為八進制數值數據 輸入和輸出
setpxecision(int p) 設置浮點數的精度位數 輸出

  比如要把123當作十六進制輸出:file1<<hex<<123;要把3.1415926以5位精度輸出:file1<<setpxecision(5)<<3.1415926。

  2、二進制文件的讀寫
①put()
  put()函數向流寫入一個字符,其原型是ofstream &put(char ch),使用也比較簡單,如file1.put('c');就是向流寫一個字符'c'。

②get()
  get()函數比較靈活,有3種常用的重載形式:

  一種就是和put()對應的形式:ifstream &get(char &ch);功能是從流中讀取一個字符,結果保存在引用ch中,如果到文件尾,返回空字符。如file2.get(x);表示從文件中讀取一個字符,並把讀取的字符保存在x中。

  另一種重載形式的原型是: int get();這種形式是從流中返回一個字符,如果到達文件尾,返回EOF,如x=file2.get();和上例功能是一樣的。

  還有一種形式的原型是:ifstream &get(char *buf,int num,char delim='n');這種形式把字符讀入由 buf 指向的數組,直到讀入了 num 個字符或遇到了由 delim 指定的字符,如果沒使用 delim 這個參數,將使用缺省值換行符'n'。例如:

  file2.get(str1,127,'A');//從文件中讀取字符到字符串str1,當遇到字符'A'或讀取了127個字符時終止。

③讀寫數據塊
  要讀寫二進制數據塊,使用成員函數read()和write()成員函數,它們原型如下:

    read(unsigned char *buf,int num);
    write(const unsigned char *buf,int num);

  read()從文件中讀取 num 個字符到 buf 指向的緩存中,如果在還未讀入 num 個字符時就到了文件尾,可以用成員函數 int gcount();來取得實際讀取的字符數;而 write() 從buf 指向的緩存寫 num 個字符到文件中,值得注意的是緩存的類型是 unsigned char *,有時可能需要類型轉換。

例:

    unsigned char str1[]="I Love You";
    int n[5];
    ifstream in("xxx.xxx");
    ofstream out("yyy.yyy");
    out.write(str1,strlen(str1));//把字符串str1全部寫到yyy.yyy中
    in.read((unsigned char*)n,sizeof(n));//從xxx.xxx中讀取指定個整數,注意類型轉換
    in.close();out.close();

四、檢測EOF
  成員函數eof()用來檢測是否到達文件尾,如果到達文件尾返回非0值,否則返回0。原型是int eof();

例:  if(in.eof())ShowMessage("已經到達文件尾!");

五、文件定位
  和C的文件操作方式不同的是,C++ I/O系統管理兩個與一個文件相聯系的指針。一個是讀指針,它說明輸入操作在文件中的位置;另一個是寫指針,它下次寫操作的位置。每次執行輸入或輸出時,相應的指針自動變化。所以,C++的文件定位分為讀位置和寫位置的定位,對應的成員函數是 seekg()和 seekp(),seekg()是設置讀位置,seekp是設置寫位置。它們最通用的形式如下:

    istream &seekg(streamoff offset,seek_dir origin);
    ostream &seekp(streamoff offset,seek_dir origin);

  streamoff定義於 iostream.h 中,定義有偏移量 offset 所能取得的最大值,seek_dir 表示移動的基准位置,是一個有以下值的枚舉:

ios::beg:  文件開頭
ios::cur:  文件當前位置
ios::end:  文件結尾
  這兩個函數一般用於二進制文件,因為文本文件會因為系統對字符的解釋而可能與預想的值不同。

例:

     file1.seekg(1234,ios::cur);//把文件的讀指針從當前位置向后移1234個字節
     file2.seekp(1234,ios::beg);//把文件的寫指針從文件開頭向后移1234個字節
回復更多評論
#re: ofstream ifstream 文件操作 2007-06-14 22:56聶文龍C++ 中關於文件的讀入和輸出。
Example : 從in.txt 文件中讀入數據,並輸出到out.txt中,輸出的文件中每行之間有一空行相隔



#include
#include
#include
using namespace std;
int main (int){

string s;

ifstream inf;
inf.open("in.txt");

//打開輸出文件
ofstream outf;
outf.open("out.txt");


//從in.txt 文件中讀入數據,並輸出到out.txt中
/*其中 getline(參1,參2); 作用是從 inf 指向的文件中
每次讀入一行,把數據存到字符串s 中,從第一行開始
 每讀完一行后,系統自動地把指針指向下一行,不用人為
 干預*/
while( getline(inf,s ) ){
outf << s << '\n\n'; //我這里並沒有用到字符串
cout << s << endl << endl; //數組,而是只用了一個串
} //S,是因為我每次讀入一行
//后,立即就把它輸出到


//out.txt中,跟着讀下一行

inf.close();
outf.close();
return 0;
}

========================================方法二============================================

#include
#include
#include
#include
using namespace std;
int main (int){



ifstream inf;
inf.open("in.txt");


ofstream outf;
outf.open("out.txt");

/*這道題有許多解法的,重要的要了它文件輸入輸出的原理
 你可以一行行地讀入,也可以一個字一個字地讀入,或一個詞
 一個詞地讀入,整型或浮點型讀入,看你定義的是哪種數據類型*/

char c;
inf >> noskipws; //不忽略空白,把每行最后那個'\n'
//也讀進來。
while(inf >>c)
{
if (c == '\n'){ //遇到 '\n' 回車、換行。
outf << "\n\n"; //輸出到文件
cout << "\n\n"; //輸出到屏幕
}

else{
outf << c; //輸出到文件
cout << c; //輸出到屏幕
}
}
/* 同樣的原理,從文件中讀入單個字符,每次讀入一個后,
  系統自動地把指針指向下一個字,而不用你指定這次讀哪個,
下次讀哪個,除非你不想從第一個開始讀,比如說:我想從
第100個字開始讀,或者我想讀最后50個字。這就需要調用
相應的函數,並指定相應的位置。*/


inf.close();
outf.close();
return 0;
}





主  題: 請問VC++中,怎么實現讀取.txt文件時的行定位,就是讀取指定的行的內容.





請問VC++中,怎么實現讀取.txt文件時的行定位,就是讀取指定的行的內容.





?
一行一行的讀到你想要的那行。
CStdioFile的ReadString()方法是讀一行。


[VC] 文件對話框讀寫文本文件
2005年 01月23日
文件對話框讀寫文本文件/*************************************************
* 讀文本文件
**************************************************/
//顯示文件打開對話框
CFileDialog dlg(TRUE, "SQL", "*.txt",OFN_HIDEREADONLY
|OFN_OVERWRITEPROMPT,"Text Files(*.txt)|*.txt|SQL Files(*.sql)|*.sql|All Files(*.*)|*.*||");
if ( dlg.DoModal()!=IDOK ) return;
//獲取文件的絕對路徑
CString sFileName=dlg.GetPathName();
//打開文件
CStdioFile out;
out.Open(sFileName, CFile::modeRead);
CString sSql="",s;
//讀取文件
do{
out.ReadString(s);
sSql=sSql+s+"\r\n";
}while ( out.GetPosition()out.Close();
//AfxMessageBox(sSql);


/*************************************************
* 寫文本文件
**************************************************/
//顯示文件保存對話框
CFileDialog dlg(FALSE, "SQL", "*.txt",OFN_HIDEREADONLY
| OFN_OVERWRITEPROMPT,"Text Files(*.txt)|*.txt|SQL Files(*.sql)|*.sql|All Files(*.*)|*.*||");
if ( dlg.DoModal()!=IDOK ) return;
//獲取文件的絕對路徑
CString sFileName=dlg.GetPathName();
CStdioFile out;
//打開文件
out.Open(sFileName, CFile::modeCreate | CFile::modeWrite);
//保存文件
CString sSql="文本文件內容";
out.WriteString(sSql);
out.Close();
我要讀一個文件,但是我想讓一行一行的讀,而且每行有不一定長度的,應該怎么做呢?
(cqwally發表於2001-8-9 23:37:43)

1)
程序如下:
{

.....................
CStdioFile file;
CString str;
file.Open("test.txt",CFile::modeRead,NULL);
file.ReadString(str);
MessageBox(str);//第一行
file.ReadString(str);
MessageBox(str);//第二行
.....................
}



看看兩次顯示的有什么不同。test.txt文件如下:
第一行
第二行


2)
我用CFile::Write,怎樣才可以寫入回車,空格?而且我要寫兩欄要對齊?
回車換行:"\r\n"

如何正確的使用CFile::Open中的參數?
(taxiblackangel發表於2001-8-14 10:58:16)

[問題提出]
我設計了一個從記事本中讀數據的程序。將數據顯示在視中。
代碼如下:

void CTry1View::OnShow()
{
// TODO: Add your command handler code here
CStdioFile file;

CString filename;
CFileDialog opendlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,".(*.txt)|*.txt|All Files(*.*)|*.*||",NULL);
if(opendlg.DoModal()==IDOK)
filename=opendlg.GetPathName();
if(file.Open(filename,CFile::modeCreate|CFile::modeReadWrite|CFile::typeText)==0)
{

AfxMessageBox("error");
return;
}

while(file.ReadString(string))
{
strList.AddTail(string);
string.ReleaseBuffer();
}

flag=true;
Invalidate();
}
結果不但在視中沒有任何顯示,而且記事本中的數據也全部丟失。變成了一片空白。真是搞不懂了。
記事本中的數據是我隨便寫的。如下:
11
222
3333
44444
.......

[解決方法]
在file.Open(filename,CFile::modeCreate|CFile::modeReadWrite|CFile::typeText)中,CFile::modeCreate去掉,modeCreate的意思是沒有此文件就建立,有了此文件,清空文件.


最新評論 [發表評論] 查看所有評論 推薦給好友 打印

最好是這樣file.Open(filename,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::typeText),因為CFile::modeNoTruncate意思是文件即使存在也不清空。 ( lichihang 發表於 2003-12-29 8:33:00)

如何使用CStdioFile::ReadString來讀文件?
(yello2000i發表於2001-8-16 17:04:39)

[問題提出]
一數據文件一行一條記錄,我用file.readstring()一次讀一行,並對讀取的數據做一些處理;
請問:while(文件還沒到結尾)
{
file.readstring();
...
}
??文件還沒到結尾如何判斷?
如果,到了指定位置不讀了,過一會兒再讀又如何做?
[解決方法]
while()中不用另加判斷條件了,因為CStdioFile::ReadString()本身就是判斷標志,若沒有了(文件到頭)返回NULL,因此:while(file.ReadString(s)){}就可.
[程序實現]
假設你已有了名為ts.txt的文件在你的工程目錄下:
{
CStdioFile file;
CString sss;
char ccc[100];
DWORD o=0;
int ol=0;
file.Open("ts.txt",CFile::modeRead);
while(file.ReadString(sss))
{
ol++;
if(ol>1)//讀兩次就不讀了.
break;

}
o=file.GetPosition();//記錄上次的結果(讀到哪了)
.................
file.Seek(o,0);//接着上回讀
while(file.ReadString(sss))
{
strcpy(ccc,sss);
AfxMessageBox(ccc);
}
}




這樣的命名叫人看了好難受的 又是o
又是0
我 覺得要測試的 字符就是"\n, \r, \r\n, or EOF. "
就可以了
( wshust 發表於 2004-3-4 21:28:00)

上面lichihang,我試了一下,事實並不是如你所說的那樣讀到空行就停了,而是一直讀下去呀!! ( pamir 發表於 2004-2-9 8:31:00)

我不同意這個回答!
因為CStdioFile::ReadString()返回NULL的條件是遇到文件尾或者一個空行,所以如果說txt文件的某一條記錄后面連續出現了若干條空行,那么CStdioFile::ReadString()函數也會返回NULL,這樣文件並沒有讀取完畢! ( lichihang 發表於 2003-12-29 8:26:00)


刪除目錄及目錄下所有文件與子目錄
(Hermess發表於2002-5-24 22:10:27)

  VC++只提供了刪除一個空目錄的函數,而在實際應用中往往希望刪除其下有很多子目錄與文件的目錄。為了實現這一功能,我編寫了DeleteDirectory 函數,它可以實現這一功能。

函數原型:BOOL DeleteDirectory(char *DirName);
返回值:成功刪除時返回TRUE,否則返回FALSE
參數DirName為要刪除的目錄名,必須為絕對路徑名,如“c:\\temp"。

函數定義如下:
BOOL DeleteDirectory(char *DirName)
{
CFileFind tempFind;
char tempFileFind[200];
sprintf(tempFileFind,"%s\\*.*",DirName);
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!tempFind.IsDots())
{
char foundFileName[200];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200));
if(tempFind.IsDirectory())
{
char tempDir[200];
sprintf(tempDir,"%s\\%s",DirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{
char tempFileName[200];
sprintf(tempFileName,"%s\\%s",DirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
tempFind.Close();
if(!RemovwDirctory(DirName))
{
MessageBox(0,"刪除目錄失敗!","警告信息",MK_OK);
return FALSE;
}
return TRUE;
}
搜集--- 關於“按行讀取”“查找特定字符串”“替換字符串”操作
氣死了,剛剛誤操作,畫了一半的表格全都沒了。哼哼,沒有好興致說些有趣的話了,愛看不看,愛聽不聽。氣死了!偏偏還要在網頁上寫,還要不保存!

不說上午的事情了,

直奔主題氣死!

關鍵詞:文本文件 按行讀取 查找特定字符串 替換字符串

C/C++ VC/MFC

按行:fgets();getline(); StdioFile::ReadString(buf)CArchive::ReadString(CString &str)

查找:strstr();_tcschr();fseek() buf.Find(str)(buf是CString類型的)

替換:替換字符串

代碼:

CStringFile CLASS


我用fopen打開一個txt文件,想查找某一字符串,找到這個字符串后,再讀取它對應行的

其他數據,請教大俠指點小弟如何去做,用什么函數。謝謝。



a. fopen過后,逐行讀入str, 用 strstr 判斷是否含有特定字符串. 例子:

FILE *fd=fopen("你要打開的文件","r+");

char tmpLine[200];

while(fgets(tmpLine,200,fd)!=NULL)

{

if( strstr(tmpLine,"你要找的字符串"))

{

printf("find the string!\n");

break;

}

memset(tmpLine,0,200);

}

free(tmpLine);



//從指定文件中提取指定字符串

CStrOP& CStrOP::GetSpecifyString(LPCTSTR szSpec, CArchive *ar, BOOL bMid, int iMid, int *pRow, int *pCol)

{

do

{

//讀取文件內容

if(ar)

{

//判斷是否到了文件最末

if(!ar->ReadString(*this))

{

//未找到找到字符串

if(pRow)

{

*pRow = 0;

}

if(pCol)

{

*pCol = 0;

}

(*this).Format("%s", "");

break;

}

}

//獲得需要查找的字符串所在行

if(pRow)

{

(*pRow)++;

}

//去掉空白字符

TrimLeft();

TrimRight();

//判斷是否已經找到需要的字串

if(Find(szSpec) >= 0)

{

//獲得需要查找的字符串所在列

if(pCol)

{

*pCol = Find(szSpec) + 1;

}

//判斷是否需要提取字符串

if(bMid)

{

//判斷提取字符串的規則,如果iMid為-1,則不論字串在任何位置,都可以

//進行提取;否則,字串必須在指定位置iMid時才可以提取

if(iMid == -1)

{

(*this).Format("%s", Mid(Find(szSpec) + lstrlen(szSpec)));

break;

}

else if(iMid >= 0)

{

if(Find(szSpec) == iMid)

{

(*this).Format("%s", Mid(iMid + lstrlen(szSpec)));

break;

}

}

}

}

else

{

if(!ar)

{

//未找到找到字符串

if(pRow)

{

*pRow = 0;

}

if(pCol)

{

*pCol = 0;

}

(*this).Format("%s", "");

break;

}

}

} while(1);



return *this;

}

其中CStrOP是我新建的類,函數聲明為

CStrOP& GetSpecifyString(LPCTSTR szSpec, CArchive *ar = NULL, BOOL bMid = TRUE, int iMid = 0, int* pRow = NULL, int* pCol = NULL);

這個函數能實現在指定文本格式的文件中進行特定字符串的查找、提取、定位等工作,其中參數CArchive ar初始化為:

CFile file(cMyTxtFile,CFile::modeRead)

CArchive ar(&file, CArchive::load)  

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com