Yahoo 知識+ 將於 2021 年 5 月 4 日 (美國東岸時間) 停止服務,而 Yahoo 知識+ 網站現已轉為僅限瀏覽模式。其他 Yahoo 資產或服務,或你的 Yahoo 帳戶將不會有任何變更。你可以在此服務中心網頁進一步了解 Yahoo 知識+ 停止服務的事宜,以及了解如何下載你的資料。

JJ
Lv 7

如何跳過 C 程式的錯誤訊息

我用C 在DOS 底下找尋某特定檔案夾 TNT_MATH

==========================

for (i = 65: i < 85; i++)

{

sprintf(name, "%c:\\TNT_MATH", i);

k = access(name, 0);

if (k == 0) break;

}

==========================

問題是:

如果 A槽沒放磁碟片 或 D槽(DVD)沒放DVD片

都會出現

Not ready reading drive xx

Abort, Retry, Fail?

有什麼辦法可以讓它不管這訊息而自動找下一個槽嗎?

更新:

歡迎提供任何方法

如果批次檔可行 我也可以試著結合兩者

特別強調 "不知道 TNT_MATH 是在那一個dirver 底下"

更新 2:

To prisoner26535 大大:

F_OK 就等於 0. 所以兩者的結果是一樣的.

都會顯示 "未放磁片 (或DVD 的訊息)

更新 3:

To prisoner26535 大大:

我試用您的方法

結果還是一樣.

更新 4:

To 東邪無弓 大師:

先謝謝您, 果然不再顯示 error message.

額外的問題,

您的 DREADY.COM 用什麼語言寫的

方便分享程式內容嗎

我試著改成 "IF exist %1:\TNT_MATH ..."

它可以跳過沒有DVD 的D槽

卻無法跳過沒有磁片 的A槽

更新 5:

To 東邪無弓 大師:

抱歉 先前沒寫清楚

我是把.\DREADY %1: 換成

"IF exist %1:\TNT_MATH ..."

所以 A槽才會出問題

而 之所以那樣試

乃因為不知道DREADY.COM的細節

才會有點猶豫 要不要試別的方法(未消化前 不易吸引)

其實用大師的DREADY.COM是完全不會出現 error message 的

更新 6:

未消化前 不易吸收

更新 7:

Jacob 大師您好:

執行的結果如下:

(我的硬牒分成 C 和 D; E 是 DVD; TNT_MATH 放在 F

================

A drive exist, but media is not found!

C:. isn't ReadOnly

D:FOUND.000 isn't ReadOnly

E drive exist, but media is not found!

F:TNT_MATH isn't ReadOnly

請按任意鍵繼續 . . .

================

更新 8:

Jacob 大師您好:

執行的結果會將 C, D 的訊息改成 TNT_MATH is not exist.

我想 那些訊息應該是您寫的output 吧

那現在可以 post 您的 C code 嗎

更新 9:

Jacob 大師您好:

您的 C code 無法在 Borland C 底下編譯

您大概可以猜到 我的東西會和數學(TNT_MATH)有關係

我不敢保證每個學生(他們屬於數學的學生 不是電腦的學生)的電腦都有 "特殊程式" 所需的driver

所以才會用最基本的 DOS 來做

在此種情況下

您的程式是否可以做某種程度的修改呢

更新 10:

Jacob 大師您好:

底下是錯誤的訊息

Undefind structure '_finddata_t'

Size of 'FileInfo' is unknow or zero

Undefind simbol:

'intptr_t' (以及由此產生的後續錯誤)

'Hnd'

'name'

'attrib'

'_A_RDONLY'

Warning (no prototype):

GetLogicalDrives

GetVolumeInformation

_findfirst

_findclose

更新 11:

果然 知識就是力量

不是不用 而是不知道要去換

過去的Borland C 一直都可以解決我的專案

(我比較偏向解決 application 而不是系統上的東西)

所以...

結論: DEV C (4.9.9.2)可以編譯 也沒有錯誤或警告

而且不必加裝其他檔案

甚至在98 上面也沒有問題

5 個解答

評分
  • ?
    Lv 7
    9 年前
    最愛解答

    一、批次檔

    把底下的批次指令,以「ReadyDrv.BAT」存檔

    @ECHO OFF

    IF NOT %1#==# GOTO S1

    SET UD=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

    ECHO 0>ReadyDrv.txt

    %0 %UD%

    :S1

    IF %1#==# GOTO END

    .\DREADY %1:

    IF ERRORLEVEL 1 GOTO S2

    echo %1>>ReadyDrv.txt

    :S2

    SHIFT

    GOTO S1

    :END

    SET UD=

    ======

    二、C程式範例:finddrv.C

    #include <stdlib.h>

    #include <stdio.h>

    int main(int argc, char** argv)

    {

    FILE *inf;

    char dd;

    system("cmd /C ReadyDrv.bat");

    inf = fopen("ReadyDrv.txt","r");

    if (inf == NULL) exit(1);

    while(!feof(inf) && fscanf(inf, " %c", &dd) == 1)

    {

    printf("%c\n",dd);

    /* do something you want

    sprintf(name, "%c:\\TNT_MATH", i);

    k = access(name, 0);

    if (k == 0) break;

    */

    }

    system("pause");

    return 0;

    }

    ======

    說明:

    1.把批次檔、C編譯後的執行檔、DREADY.COM 這三個檔放在相同的目錄內。

     (DREADY.COM 已內含在本文所附連結的壓縮檔內)

    2.ReadyDrv.BAT 批次檔會掃瞄電腦目前已 Ready 的裝置,

     並把其代碼存在 ReadyDrv.txt 文字檔內。

     (不會有題文所述停駐之狀況)

    3.C範例程式,先以 system 呼叫 cmd 來執行上述之批次檔。

     然後以其輸出之文字檔 ReadyDrv.txt 為來源,依序讀入其內容,

     此內容即為目前已 Ready 的裝置。

    4.範例中註解那一段請自行安排你要做的工作。

    附檔:[按此下載] http://www.funp.net/488007

    2012-09-03 09:48:54 補充:

    如要套用你題文所示之工作,

    註解之那一小段可安排如下:

    int k;

    char name[32]="c:\\TNT_MATH";

    name[0]=dd;

    k = access(name, 0);

    if (k == 0) break;

    拙答之範例程式中,忘了 close file,

    請在迴圈結束後,補個 fclose(inf); 才算周延。

    ======

    拆成C與DOS批次的組合,是著眼於批次檔的容易操弄。

    實務應用時,欲求精簡,

    也可直接用 spawn 來引用 DREADY.COM,把批次的工作融入C程式中。

    2012-09-03 12:16:04 補充:

    DREADY.COM是我在N年前的古老收藏,找了一陣子才找出來,已忘了其來源。

    但可斷定那是那是用組語寫的。

    你若要在批次檔中直接偵測檔案,可把S1區段改成如下:

    :S1

    IF %1#==# GOTO END

    .\DREADY %1:

    IF ERRORLEVEL 1 GOTO S2

    IF exist %1:\TNT_MATH ...

    (\請改回半形)

    沒有放磁片的A碟,同樣不會停駐,你再試試。

    2012-09-06 01:44:47 補充:

    用免費的DEV C便可順利編譯(雖然可能會出現warnning,但仍可順利編譯),為何不用?

  • JJ
    Lv 7
    9 年前

    感謝兩位大師的相助

    除了解決我的問題外

    又有諸多的收穫

    1. 多了解 DOS 批次檔的功能(仍屬初級)

    2. 從批次檔中 又學到新的邏輯(流程運作法)

    3. 略窺C 中關於系統的指令

    4. 可嘗試新的 DEV C

    這才是 知識+ 的精髓 不是嗎

  • ?
    Lv 7
    9 年前

    這幾天太忙,沒空弄。

    沒想到東大已做好了。

    因為東大的 .com 在我的 64-bit 系統不能跑!(可惡的微軟!)

    所以,我還是弄了一個。

    測了 CD, 讀卡機,都可以。

    但,我沒有軟碟機了!

    為了讓我的64能跑,為了有軟碟機的網友能當白老鼠,我還是把它post出來。

    (先 post EXE 版)

    有白老鼠能幫忙嗎?

    下載網址

    http://www.funp.net/997833

    Compiler: VS 2010

    不能跑的請安裝

    http://www.microsoft.com/en-us/download/details.as...

    2012-09-05 13:43:03 補充:

    那就對了。

    你應該沒裝 B:,也沒有G~Z的東東(含網路碟)。

    A, D 碟應該有機器,但是沒放片子。

    = = = =

    你可以把 TNT_MATH 打在那程式的後面當參數看看。

    2012-09-05 15:53:48 補充:

    http://www.funp.net/842529

    2012-09-05 21:41:35 補充:

    我沒有 Borland C。

    我明天試試 TC版。

    如果 TC 能跑,Borland 可?

    TC 版會用一些很原始的東東喔!

    2012-09-05 21:42:23 補充:

    對了,Borland C 是哪不過?

    if (i) 前的那一列嗎?

  • 9 年前

    你一定要用C 語言嗎

    可以直接用批次檔來處理

  • John
    Lv 6
    9 年前

    不知道是不是該這樣說,你選錯方式了。

    你使用的讀寫檔案方式,

    我猜是透過DOS環境,

    其本身有這個訊息。

    你應該是要換個方法。

    ps. 不過,我沒研究這邊,不清楚有什麼其他方式。

還有問題嗎?立即提問即可得到解答。