2013-07-04 48 views
2

看完K & R之後,似乎除了像printf,scanf,getchar等熟悉的C之外,還有很多I/O函數。另外,他們中的一些人的細微差別喜歡是否存儲'\ n'字符,EOF或NULL在錯誤時返回,默認輸入流(stdin/keyboard)等等。這裏列出了我已經能夠使用的I/P功能拿出:基於K&R的C中各種I/O函數的比較

I/P功能: scanf函數 的fscanf 的getchar 龜etc GETC 得到

當我單獨閱讀他們的描述時,我似乎明白了,但是如果我必須選擇一個而不是另一個,我會感到困惑,如果你明白我的意思,一切都會混亂起來。任何人都可以清楚地總結何時使用哪個函數和選擇一個優先級(getchar vs getc vs scanf)的優缺點?

Bonus Point:K的R的getline函數在上述場景中是否適合?

+1

你能不能給的任務,這使得這些功能之間做出一個決定困難的例子嗎? –

回答

3

輸入和輸出之間的差異在OP中很明顯,所以我們着重討論其他的。

差分1:某些功能採取FILE*,一些會假定:stdint用於輸入,stdout爲輸出)。如果你是goint使用stdin/stdout文件,只需使用簡單的:

  • 採取FILE*fprintffscanffgetcfgetsfputcfputs
  • 別拿FILE*printfscanfgetchargetsputcharputs

注意模式?以f開頭的函數的FILE* ...例外是putcgetc,這等價於它們的f*對應項。只是不要使用它們......它們很奇怪。

差異2:一些函數格式化參數,一些函數採用單個字符,一些採用字符串。這很容易看出,我懶得再次列舉他們。使用任何最適合你的東西。

差異3:根本不應該使用某些函數。 IMO他們是getc,putc,gets,puts。它們分別奇怪,奇怪,不可能正確使用,也不可能。

差異4:返回值。所有函數返回int與讀取/寫入字符(或EOF出錯)不同的是:

  • fgetsgets返回,他們採取的參數(或NULL如果錯誤)相同的指針。這被認爲是方便保存的代碼行:memcpy(buffer, fgets(buffer2, 100, file));。但是,由於你應該使用指針之前,檢查錯誤,實際的返回值是除了它比較NULL.
  • *printf返回寫入的字節數大多無用。
  • *scanf返回讀取的輸入項數。

嗯,這是不是一個表,但IHTH。