• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 298  文章 - 377  trackbacks - 0
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(34)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            收藏夾

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            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= {12345}; 
              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 聶文龍 閱讀(68584) 評論(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)

              回復  更多評論
              
            久久夜色精品国产噜噜噜亚洲AV| 激情综合色综合久久综合| 国产一区二区久久久| 伊人久久大香线蕉综合影院首页| 日韩人妻无码精品久久久不卡| 久久久久久无码Av成人影院| 久久精品国产一区| 亚洲伊人久久成综合人影院| 久久Av无码精品人妻系列| 国产免费久久久久久无码| 亚洲精品无码成人片久久| www.久久热| 亚洲中文字幕无码久久2020 | 久久伊人精品青青草原高清| 亚洲人成电影网站久久| 伊人色综合久久| 久久亚洲精品无码AV红樱桃| 亚洲日本va午夜中文字幕久久| 91精品国产综合久久精品| 久久人人爽人人人人片av| 国产精品亚洲美女久久久| 久久久久人妻一区二区三区vr| 青青热久久国产久精品| 久久精品免费观看| av无码久久久久久不卡网站| 久久精品国产99久久久古代 | 久久综合九色综合网站| 日本国产精品久久| 久久影院久久香蕉国产线看观看| 久久综合九色综合久99| 久久婷婷成人综合色综合| 亚洲精品无码久久久久久| 色综合久久中文字幕无码| 国产99久久久国产精品小说| 亚洲国产成人久久精品99| 四虎国产精品成人免费久久| 无码任你躁久久久久久老妇| 日韩AV毛片精品久久久| 一本色道久久88综合日韩精品 | 亚洲国产成人久久精品99| 久久精品国产亚洲一区二区三区|