線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1402
推到 Plurk!
推到 Facebook!

讀取檔案的問題

尚未結案
newfbimod
一般會員


發表:3
回覆:9
積分:2
註冊:2004-11-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-27 16:11:11 IP:203.69.xxx.xxx 未訂閱
各位前輩, 小弟想請問一下若我想從Original.txt讀出裡面的文字,並將其順序顛倒寫入new.txt裡,也就是說若在Original.txt裡的文字為abc,那存到new.txt 應該是cba,我的程式碼如下 #include #include using namespace std; char* filein= "Original.txt"; char* fileout="new.txt"; //--------------------------------------------------------------------------- void main() { long CharNum, offset; char Ch; fstream input(filein,ios::in); if(!input) { cout<<"in-file open fail"<
fffhghgjh
一般會員


發表:2
回覆:33
積分:17
註冊:2004-12-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-07 11:13:29 IP:61.220.xxx.xxx 未訂閱
char* filein= "c:\\Original.txt";//檔案位置要設定好
char* fileout="c:\\new.txt";    #pragma argsused
int main(int argc, char* argv[])
{
    long CharNum, offset;
    char Ch;
    fstream input;
    fstream output;
    input.open(filein,ios::in);
    if(!input)
    {
        cout<<"in-file open fail";
    }
    output.open(fileout,ios::out);
    if(!output)
    {
        cout<<"out-file open fail";
    }
    input.seekg(0L,ios::end);
    CharNum = input.tellg();
    for(offset=1L;offset<=CharNum;offset  )
    {
        input.seekg(-offset, ios::end);
        Ch=input.get();
        output<
        
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-07 13:06:58 IP:59.120.xxx.xxx 未訂閱
我利用Devc 跑出來正常 設不設路徑應該沒有關係 只是產生的檔案在於指定的目錄下或者跟執行檔同一目錄下!:)
newfbimod
一般會員


發表:3
回覆:9
積分:2
註冊:2004-11-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-08 10:54:50 IP:203.69.xxx.xxx 未訂閱
不好意思 我剛try了一下 我產生的檔案市跟執行檔位於同一目錄下阿 且我也有將路徑設定好囉 可是 輸出的檔案還是什麼都沒有阿 不過靈異的是 我看字元數目檢查 字元數跟我的輸入檔是一樣的說 可是為什麼看不到半個字呢 難道是我的電腦有問題< >< >
rogan321
高階會員


發表:21
回覆:307
積分:200
註冊:2003-05-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-08 15:54:31 IP:203.204.xxx.xxx 未訂閱
引言: 不好意思 我剛try了一下 我產生的檔案市跟執行檔位於同一目錄下阿 且我也有將路徑設定好囉 可是 輸出的檔案還是什麼都沒有阿 不過靈異的是 我看字元數目檢查 字元數跟我的輸入檔是一樣的說 可是為什麼看不到半個字呢 難道是我的電腦有問題< >< >
Hi~newfbimod 看了一下應該不是靈異現象~你的程式碼這裡好像有錯~ 你改成如下應該就沒問題了
 
for(offset=CharNum-1;offset>=0;offset--)
{
            input.seekg(offset);
          Ch=input.get();
        output<     
        
newfbimod
一般會員


發表:3
回覆:9
積分:2
註冊:2004-11-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-08 16:32:47 IP:203.69.xxx.xxx 未訂閱
rogan321大大你好唷 try了你的方法, 字元是可以正常顯示成我要的答案可是我還是有個疑問唷你的方法 for(offset=CharNum-1;offset>=0;offset--) {             input.seekg(offset);           Ch=input.get();         output<
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-01-08 21:09:20 IP:218.19.xxx.xxx 未訂閱
newfbimod 您好:    我沒有測試過您的程式 (因為顯示出來的程式碼似乎不完整,建議您下回在程式碼前後加上 [code][/code] 這一組內含指令簡碼),但因為您提到 "字元數目檢查字元數跟我的輸入檔是一樣的",所以您應該先使用查看 Hex 碼的工具或 DOS 的 debug 工具來確認一下,看看新檔案被填入的內容是不是原始檔內的資料?如果確定檔案內容確實有被填寫而不是空白的內容的話,那麼問題就可能是出在 "檔案結尾字元 (EOF)" 這上頭了,我猜想您是在 DOS 或類似的環境下查看檔案內容的,因為檔案內容被您 "反過來" 填寫,因此原先的 "檔案結尾字元" 就變成檔案開頭的第一個字元了,當您使用 DOS 指令來 TYPE 檔案內容時,其後的資料就看不到了。 我不知道您對 "檔案結尾字元 (EOF)" 熟不熟?我簡單的說明如下: EOF = End Of File character EOF = ASCII Code 26 (0x1A) = Ctrl-Z 如果您使用 XVI32 這類查看 HEX Code 的程式載入檔案,或是透過 DOS Box 使用 debug 指令載入檔案,查看檔案的第一個位元組,若該位元組是 "1A",那就對了! 您將測試檔案改成不使用 EOF 結尾的格式,或是轉換時先檢查原始檔案是否有 EOF 字元?若有的話則予略過,這樣子應該就可以了。
rogan321
高階會員


發表:21
回覆:307
積分:200
註冊:2003-05-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-01-08 21:55:21 IP:203.204.xxx.xxx 未訂閱
引言: 應該是從"檔案開始"的地方,往後算offset,然後移到 最後一個字元開始讀取 而我之前的方法,則是先移到檔案結束的地方然後往前算offset開始讀取字元 for(offset=1L;offset<=CharNum;offset ) { input.seekg(-offset, ios::end); Ch=input.get(); output< Hi~newfbimod 分兩個部分來討論~ 第一~ input.seekg(-offset, ios::end);請問這個用法的意思是什麼? 你嘗試看看在迴圈中這用法後加入
 long a=input.tellg();
cout<
沒意外應該會傳回-1表示檔案旗標移動失敗
第二~
input.seekg(-offset)
為什麼這樣用,給減號在前方?這應該表示負數吧?那不就是移到負數的地方?
為何不用通用的寫法:(offset-1)~維護起來也較為方便~
以上為個人的觀念~或許有不正確,還望指正     
        
newfbimod
一般會員


發表:3
回覆:9
積分:2
註冊:2004-11-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-01-10 10:51:33 IP:203.69.xxx.xxx 未訂閱
rogan321大大 沒錯 他的確回傳-1 表示我的檔案旗標移動失敗 至於input.seekg(-offset, ios::end);我是根據我書上的範例所key-in 它的意思是從檔案結束的位置移到倒數第offset個字元的位置 在BCB的help檔裡有這樣一段seekg(off_type& off, ios_base::seekdir dir);跟這一段 typedef int      seekdir;    enum seek_dir {                      beg         = 0x0,                        cur         = 0x1,                       end         = 0x2                      }; 那我想請問大大到底seekg的用法是如何去使用它呢? 根據help檔 它應該可以從檔案開始, 跟目前位置,及檔案結束位置來做不同的處理    
rogan321
高階會員


發表:21
回覆:307
積分:200
註冊:2003-05-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-01-11 00:55:58 IP:203.204.xxx.xxx 未訂閱
Hi~newfbimod 我看了一下help基本上seekg(n)和seekg(n,seek_dir)雖然為多型,但是呼叫不同的函式來處理位移量 seekg(n)初期式呼叫pubseekpos()再呼叫seekpos()~ 而seekg(n,seek_dir)呼叫pubseekoff()再呼叫seekoff()~ 然後兩者皆傳回pos_type(n)函式的傳回值來決定旗標的位置~所以問題應該就是出在seekoff()這個函式你有興趣可以查看strstrea.cpp這個檔案它的主code就在這裡,我猜想是不同os的關係~像pubseekoff(off, dir, ios_base::in)這個字元位移的函式在LINUX下就有問題~而必須修正某些地方才能編譯~純屬推測~煩請先進不吝指正
系統時間:2024-06-26 14:29:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!