Yahoo 知識+ 將於 2021 年 5 月 4 日 (美國東岸時間) 停止服務,而 Yahoo 知識+ 網站現已轉為僅限瀏覽模式。其他 Yahoo 資產或服務,或你的 Yahoo 帳戶將不會有任何變更。你可以在此服務中心網頁進一步了解 Yahoo 知識+ 停止服務的事宜,以及了解如何下載你的資料。
如何跳過 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 底下"
To prisoner26535 大大:
F_OK 就等於 0. 所以兩者的結果是一樣的.
都會顯示 "未放磁片 (或DVD 的訊息)
To prisoner26535 大大:
我試用您的方法
結果還是一樣.
To 東邪無弓 大師:
先謝謝您, 果然不再顯示 error message.
額外的問題,
您的 DREADY.COM 用什麼語言寫的
方便分享程式內容嗎
我試著改成 "IF exist %1:\TNT_MATH ..."
它可以跳過沒有DVD 的D槽
卻無法跳過沒有磁片 的A槽
To 東邪無弓 大師:
抱歉 先前沒寫清楚
我是把.\DREADY %1: 換成
"IF exist %1:\TNT_MATH ..."
所以 A槽才會出問題
而 之所以那樣試
乃因為不知道DREADY.COM的細節
才會有點猶豫 要不要試別的方法(未消化前 不易吸引)
其實用大師的DREADY.COM是完全不會出現 error message 的
未消化前 不易吸收
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
請按任意鍵繼續 . . .
================
Jacob 大師您好:
執行的結果會將 C, D 的訊息改成 TNT_MATH is not exist.
我想 那些訊息應該是您寫的output 吧
那現在可以 post 您的 C code 嗎
Jacob 大師您好:
您的 C code 無法在 Borland C 底下編譯
您大概可以猜到 我的東西會和數學(TNT_MATH)有關係
我不敢保證每個學生(他們屬於數學的學生 不是電腦的學生)的電腦都有 "特殊程式" 所需的driver
所以才會用最基本的 DOS 來做
在此種情況下
您的程式是否可以做某種程度的修改呢
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
果然 知識就是力量
不是不用 而是不知道要去換
過去的Borland C 一直都可以解決我的專案
(我比較偏向解決 application 而不是系統上的東西)
所以...
結論: DEV C (4.9.9.2)可以編譯 也沒有錯誤或警告
而且不必加裝其他檔案
甚至在98 上面也沒有問題
5 個解答
- ?Lv 79 年前最愛解答
一、批次檔
把底下的批次指令,以「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,但仍可順利編譯),為何不用?
- JJLv 79 年前
感謝兩位大師的相助
除了解決我的問題外
又有諸多的收穫
1. 多了解 DOS 批次檔的功能(仍屬初級)
2. 從批次檔中 又學到新的邏輯(流程運作法)
3. 略窺C 中關於系統的指令
4. 可嘗試新的 DEV C
這才是 知識+ 的精髓 不是嗎
- ?Lv 79 年前
這幾天太忙,沒空弄。
沒想到東大已做好了。
因為東大的 .com 在我的 64-bit 系統不能跑!(可惡的微軟!)
所以,我還是弄了一個。
測了 CD, 讀卡機,都可以。
但,我沒有軟碟機了!
為了讓我的64能跑,為了有軟碟機的網友能當白老鼠,我還是把它post出來。
(先 post EXE 版)
有白老鼠能幫忙嗎?
下載網址
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 補充:
2012-09-05 21:41:35 補充:
我沒有 Borland C。
我明天試試 TC版。
如果 TC 能跑,Borland 可?
TC 版會用一些很原始的東東喔!
2012-09-05 21:42:23 補充:
對了,Borland C 是哪不過?
if (i) 前的那一列嗎?