2017-09-24 57 views
-3

我可以很容易地在控制檯上用printf打印行。但是如何讀取沒有std庫的行呢?從控制檯讀取沒有STD的行

+1

爲什麼沒有標準庫? – Rakete1111

+3

'std'是什麼讓你保證它可以跨平臺工作。如果你不想使用它,你將不得不使用特定於平臺的功能。 –

+1

'printf'對面的'scanf' –

回答

1

採用標準化的方法,你的代碼將保證整個可移植不同的平臺。沒有這個,你必須爲你想要定位的每個平臺編寫代碼。

printfscanfstd::coutstd::cinstd::cerr提供便攜的方式寫入到標準輸出/標準輸入讀取/寫入標準錯誤。如果你想避免這種情況,你可能必須編寫使用

ssize_t write(int fd, const void* buf, size_t count); 

你看到在Windows標準輸出與

HANDLE GetStdHandle(DWORD nStdHandle); 
BOOL WINAPI WriteFile(
    HANDLE  hFile, 
    LPCVOID  lpBuffer, 
    DWORD  nNumberOfBytesToWrite, 
    LPDWORD  lpNumberOfBytesWritten, 
    LPOVERLAPPED lpOverlapped 
); 

,並在POSIX兼容的系統,你不能端口GetStdHandleWriteFile到Unix,也不能將write移植到Windows或其他系統(如Solaris)。即使你渴望編寫包裝函數,也會比使用標準化庫更困難。

P.S.該DWORD nStdHandle WinAPI的參數是從int fd Unix的API不同,前者requires -10, -11 and -12 for stdin/stdout/stderr,分別,而後者需要0,1和2


即使你嘗試做一些看似簡單,你最終會做加班。例如:

標準化:

#include<stdio.h> 
printf("%d + %d = %d\n", a, b, a+b); 

的Unix:

#include <unistd.h> 
// <stdio.h> and <string.h> is still needed. 
char buf[64]; 
snprintf(buf, sizeof(buf)/sizeof(char), 
    "%d + %d = %d\n", a, b, a+b); 
ssize_t written = 
    write(1, buf, strlen(buf)); 

的Windows:

#include <windows.h> 
char buf[64]; 
snprintf(buf, sizeof(buf)/sizeof(char), 
    "%d + %d = %d\n", a, b, a+b); 
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); 
DWORD dwWritten; 
BOOL failed = WriteFile(
    hOutput, buf, strlen(buf), &dwWritten, NULL 
); 

其實你必須自己來解析字符串,如果你不想使用標準功能。我用snprintf/strlen爲了便於說明,但肯​​定這是一些額外的工作。

0

標準庫提供了保證跨平臺的方法,因此建議使用它。

如果你沒有,你需要編寫針對平臺的特定代碼。

例如,如果你想針對Linux的,那麼你可以使用read()

從文件中讀取描述符