伊莉討論區

標題: C++程式收尋文字檔內容 [打印本頁]

作者: 菜成名    時間: 2011-12-8 11:39 AM     標題: C++程式收尋文字檔內容

提示: 作者被禁止或刪除 內容自動屏蔽
作者: pkturtle    時間: 2011-12-8 11:51 AM

如果是用string的話, 可以使用replace來替換

或是利用strchr來搜尋字串中特定的字元

找到後再進行更換
作者: 菜成名    時間: 2011-12-8 11:56 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: pkturtle    時間: 2011-12-8 12:05 PM

可以將讀檔的那部份po出來嗎?

想知道你讀進來的資料的儲存方式
作者: 菜成名    時間: 2011-12-8 12:31 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: pkturtle    時間: 2011-12-8 01:10 PM

大概是這樣..我沒有檔案測試

你在自己試試看吧
  1.         char a[154];
  2.         char *p, temp, newA[154];
  3.        
  4.         while (infile.getline(a ,154))
  5.         {
  6.                 p = strstr(a, "0.2 0.3");

  7.                 if (p != NULL)                //有找到0.2 0.3
  8.                 {
  9.                         //將前面的字串存到newA
  10.                         strncpy(newA, a, p - a);

  11.                         //加上要替換的字串
  12.                         strcat(newA, "123123");

  13.                         //加上後面的字串
  14.                         strcat(newA, p + strlen("0.2 0.3"));
  15.                 }

  16.                 outfile << a<<endl;
  17.         }
複製代碼

作者: 菜成名    時間: 2011-12-8 01:52 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: pkturtle    時間: 2011-12-8 01:59 PM

恩 那應該是下面的方式
  1.         char a[154];
  2.         char *p, temp, newA[154];
  3.         
  4.         while (infile.getline(a ,154))
  5.         {
  6.                 p = strstr(a, "0.2 0.3");

  7.                 if (p != NULL)                //有找到0.2 0.3
  8.                 {
  9.                         //將前面的字串存到newA
  10.                         strncpy(newA, a, p - a);

  11.                         //加上要替換的字串
  12.                         strcat(newA, "123123");

  13.                         //加上後面的字串
  14.                         strcat(newA, p + strlen("0.2 0.3"));

  15.                                                 outfile << newA <<endl;
  16.                 }
  17.                                 else
  18.                                         outfile << a<<endl;
  19.         }
複製代碼

作者: 菜成名    時間: 2011-12-8 02:07 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: pkturtle    時間: 2011-12-8 02:34 PM

回復 9# 菜成名


    newA使用前先清除裡面的內容.....
  1. //加在if 裡面
  2. memset(newA, 0, sizeof(newA));
複製代碼

作者: 菜成名    時間: 2011-12-8 02:52 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: 菜成名    時間: 2011-12-8 03:06 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: pkturtle    時間: 2011-12-8 03:22 PM

回復 12# 菜成名


給你個作法參考

讀出來的字串S將它分成三等分A, B, C
B, 被取代的字串
A, 在B前面的字串
C, 在B後面的字串

需要更換的字串叫作B1
新的組合出來的字串叫做S1

1. 將A的部分放在S1中(可以參考strncpy的部份)
2. 將B1接在S1後面(可以參考strcat的部份)
3. 將C接在S1後面(可以參考strcat的部份)

提到的陣列b[2], 應該是float的陣列吧, 要先將他轉成字串再處理

需要注意的是指標的位置, 還有字串不要超過宣告的長度

以上....
作者: 菜成名    時間: 2011-12-8 03:39 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: pkturtle    時間: 2011-12-8 03:56 PM

回復 14# 菜成名


    剛剛給的程式當中, 分析讀進來的資料是
  1. p = strstr(a, "0.2 0.3");
複製代碼
裡面是判斷"0.2 0.3"

看起來你要判斷的是"s " 然後取代後面的字串

可以參考以下
  1. while (infile.getline(a ,154))
  2. {
  3.         p = strstr(a, "s ");

  4.         if (p != NULL)                //發現"s "
  5.         {
  6.                 //將前面的字串存到newA
  7.                 strncpy(newA, a, p - a + strlen("s "));

  8.                 //加上要替換的字串
  9.                 strcat(newA, "0.x 0.x");

  10.                 outfile << newA <<endl;
  11.         }
  12.         else
  13.                 outfile << a<<endl;
  14. }
複製代碼

作者: 菜成名    時間: 2011-12-8 04:09 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: pkturtle    時間: 2011-12-8 04:10 PM

回復 16# 菜成名


只要找到規則, 就可以了

加油吧!!!
作者: 菜成名    時間: 2011-12-8 04:20 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: pkturtle    時間: 2011-12-8 04:42 PM

回覆 18# 菜成名


先問幾個問題
1. C1 0.2 0.3 0.5 後面會有東西嗎?
2. 重點是判斷"C1 ", 跟後面0.2 0.3 0.4 0.5什麼雜七雜八的都沒關係對嗎?

如果1的答案是沒有, 2的答案是對的話
可以參考下面, 我有加上註解....
你可以修改strTarget, strData的值試試看結果有什麼改變.....
  1. char a[154];
  2. char *p, newA[154];

  3. //需要處理資料那行的判斷元素
  4. char strTarget[128];
  5. sp rintf(strTarget, "C1 ");

  6. //將替換上的資料
  7. char strData[32];
  8. sp rintf(strData, "12345678");

  9. while (infile.getline(a ,154))
  10. {
  11.         //判斷讀進來的資料 是否是需要處理的那行
  12.         p = strstr(a, strTarget);

  13.         if (p != NULL)                //發現目標!!
  14.         {
  15.                 //將需要替換的字串前面所有的字串存到newA
  16.                 strncpy(newA, a, p - a + strlen(strTarget));

  17.                 //加上要替換的字串
  18.                 strcat(newA, strData);

  19.                 outfile << newA <<endl;
  20.         }
  21.         else
  22.                 outfile << a<<endl;
  23. }
複製代碼

作者: 菜成名    時間: 2011-12-8 05:03 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: pkturtle    時間: 2011-12-8 05:29 PM

回復 20# 菜成名


原來這才是你的需求......

那就試試看下面的吧.....
  1. char a[154], newA[154];

  2. //需要處理資料那行的判斷元素
  3. char strTarget[128];
  4. sp rintf(strTarget, "C2   ");

  5. //替換上的資料
  6. char strData[32];
  7. sp rintf(strData, "12      234     78     ");

  8. while (infile.getline(a ,154))
  9. {
  10.         //判斷這行的開頭是否是需要的
  11.         if (strncmp(a, strTarget, strlen(strTarget)) == 0)
  12.         {
  13.                 memset(newA, 0, sizeof(newA));
  14.                 //將需要替換的字串前面所有的字串存到newA
  15.                 strncpy(newA, a, strlen(strTarget));

  16.                 //加上要替換的字串
  17.                 strcat(newA, strData);

  18.                 outfile << newA <<endl;
  19.         }
  20.         else
  21.                 outfile << a<<endl;
  22. }
複製代碼

作者: 菜成名    時間: 2011-12-8 05:44 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: pkturtle    時間: 2011-12-8 05:56 PM

回復 22# 菜成名



這是因為論壇有限定語法

這個指令不能po出來........

所以你要將sp和rintf中間的空白消掉...
作者: 菜成名    時間: 2011-12-8 05:57 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: pkturtle    時間: 2011-12-8 07:00 PM

本帖最後由 pkturtle 於 2011-12-8 07:02 PM 編輯

回復 24# 菜成名

這要看程式怎麼設計
可以從檔案讀出
也可以寫在程式裡
作者: 菜成名    時間: 2011-12-8 07:53 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: pkturtle    時間: 2011-12-8 09:19 PM

回復 26# 菜成名


  是可以放在陣列中

  你的意思是要將檔案的值存起來?
作者: 菜成名    時間: 2011-12-8 10:55 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: kaworucloud    時間: 2011-12-8 11:05 PM

本帖最後由 kaworucloud 於 2011-12-8 11:07 PM 編輯

快 30 樓下來,我還是完全不懂樓主想幹嘛
一會 s 一會 C1 一會又是 C2 的,一點規律都沒有
能不能重頭到尾「詳細」「具體」地敘述好你的問題呀?

還有,檔案之類的東西最好丟到伊莉以外的空間去
作者: goodbye_mylove    時間: 2011-12-8 11:18 PM

快 30 樓下來,我還是完全不懂樓主想幹嘛
一會 s 一會 C1 一會又是 C2 的,一點規律都沒有
...
kaworucloud 發表於 2011-12-8 11:05 PM



    建議 +1 。
作者: 菜成名    時間: 2011-12-8 11:36 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: kaworucloud    時間: 2011-12-8 11:45 PM

所以你的目標字串是 "C2 0.03 0.03 0.03" 這 17 個字元,一個字元都不會變嗎?

而你想用來替換的值,是怎麼決定出來的?

替換之後呢?直接在螢幕印出就好?還是要另外存檔?
作者: 菜成名    時間: 2011-12-9 12:14 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: kaworucloud    時間: 2011-12-9 12:24 AM

既然都知道值是 0.03 0.03 0.03 了,自己弄個陣列 float array[3] = { 0.03, 0.03, 0.03 } 不就得了,幹嘛還需要從字串裡取出來再放進去
陣列的值隨便你要怎麼改都行,之後想拼成字串的話,用 sPrintf 就行
  1. float fArray[3] = { 0.01f, 0.02f, 0.03f };
  2. char szBuffer[18] = { 0 };
  3. sPrintf( szBuffer, "C2 %.2f %.2f %.2f", fArray[0], fArray[1], fArray[2] );
  4. Printf( "%s\n", szBuffer );
複製代碼

作者: 菜成名    時間: 2011-12-9 12:48 AM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: goodbye_mylove    時間: 2011-12-9 03:58 AM

本帖最後由 goodbye_mylove 於 2011-12-9 04:02 AM 編輯

回復 34# kaworucloud

回復 35# 菜成名

已到了雞同鴨講的地步, 一開始我與 K 大存有一樣的疑惑,
直接塞到 memory 裡面就好,要怎麼改隨便你,
最後要輸出到 console 還是寫入檔案再從 memory dump 出來。
---

猜測,原因在於 20F 原始檔前面那幾個字

....
....
See the SWMM manuals for additional notes on input format.


推斷現在情況如此:
原 po 本身用一套其他軟體,此稱  A.exe ,
(其實 A.exe 就是 SWMM.exe,用來作水道模擬之類的,
  附件註明 4.4 為最新版,但此軟體本身要再寫 script,
  運作原理有點像是 .vbs / .bat )
而 A.exe 本身需讀檔,進行輸入資料、輸入參數,
原 po 裡可能是有不少參數想試,所以想藉由 C language,
去產生 A.exe 所需之輸入檔。

若真為如此,問題敘述確實不甚妥當,
導致看的人摸不著頭緒;問的人得不到答案。
---
作者: iseeyou    時間: 2011-12-9 11:06 AM

本帖最後由 iseeyou 於 2011-12-9 04:32 PM 編輯

你要寫一個程式為 w.exe 好了, 他會處理一個檔案. E.txt 輸出一個 結果檔案 R.txt 好了.
要更要E.txt 中某一行開頭為C2 後面有三個數字. 改後面那三個數字.輸出到 R.txt
問幾個問題
1. 每次改了C2 後的三個數字, 輸出到R.txt 後. W.exe 會結束執行嗎?
2. C2後面那3個數字怎麼來的?

如果1.是會結束執行, 那跟本不用管後面3 個數字要不要存起來(跟本沒用)因為每一次都要重來. 找出E.txt 的C2 位置

如果1 是不會結束執行. 要存的也不是那3 個數字. 因為他是要被取代掉的東西. 你存了有什麼意義. 要存的是C2 前面所有的字串. 跟C2 那一行後面所有的字串.
重新輸出新檔時. 把前面的字串存檔. 在輸出C2 跟修改後的數字. 在把C2 那行後面所有的字串輸出.

2. 的問題. 如果是亂數取得3個數字. 每次都是亂數. 所以. 也跟本不需要存放C2 後面那3 個東西.


這個程式的比較好作法
a. 因為E.txt 並不大. 所以乾脆一次全部讀到memory 中
b. 找到C2 在memory 中的位置
c. 找到C2 下一行的位置
d. 輸出C2 前面所有的東西到檔案中
e. 輸出C2 x y z 三個數字.
f. 輸出c 找到的位置之後所有的東西到檔案
重複d,e,f . 每次重新產生x,y,z . 通通輸出到新的檔案中

用上面想法寫的程式
http://nopaste.info/5973637a38.html  參考看看把
作者: 菜成名    時間: 2011-12-10 02:28 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: 菜成名    時間: 2011-12-10 02:37 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: 菜成名    時間: 2012-1-3 05:08 PM

提示: 作者被禁止或刪除 內容自動屏蔽




歡迎光臨 伊莉討論區 (http://a401.file-static.com/) Powered by Discuz!