我可以很容易地在控制檯上用printf
打印行。但是如何讀取沒有std
庫的行呢?從控制檯讀取沒有STD的行
-3
A
回答
1
採用標準化的方法,你的代碼將保證整個可移植不同的平臺。沒有這個,你必須爲你想要定位的每個平臺編寫代碼。
printf
和scanf
,std::cout
和std::cin
和std::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兼容的系統,你不能端口GetStdHandle
和WriteFile
到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
相關問題
- 1. 從控制檯讀取F#
- 2. 從控制檯讀取int
- 3. Java:從控制檯讀取
- 4. 讀取從控制檯
- 5. MongoDB shell:從控制檯讀取一行
- 6. Java從控制檯讀取整數行
- 7. 從控制檯讀取多行
- 8. 從控制檯讀取Java多行
- 9. 如何從控制檯讀取? - Linux的
- 10. 從控制檯讀取數據
- 11. 從控制檯程序讀取輸出
- 12. Python 3.2.2從控制檯讀取
- 13. 從FireFox控制檯讀取JSON響應
- 14. 從控制檯讀取Unicode/ANSI
- 15. 在Java中從控制檯讀取
- 16. 從控制檯讀取字符串
- 17. 從控制檯讀取密碼輸入
- 18. 從控制檯異步讀取。
- 19. 從控制檯讀取雙精度值
- 20. 文件讀取控制檯
- 21. 從std :: cin讀取多行
- 22. Java從控制檯讀取超過1024個字符的行
- 23. 如何從Ruby的控制檯輸出中讀取第3行?
- 24. 從控制檯讀取已經輸入的行C++
- 25. 從Java控制檯程序的命令行中讀取段落
- 26. 從Lua控制檯讀取數字後,如何讀取單詞?
- 27. 從控制器的Symfony3控制檯運行控制檯命令
- 28. ObjectiveC - 從控制檯字符串中讀取多行(Breaks \ newLine)
- 29. 如何從控制檯讀取多行用戶輸入?
- 30. Java:從控制檯讀取直到變空行
爲什麼沒有標準庫? – Rakete1111
'std'是什麼讓你保證它可以跨平臺工作。如果你不想使用它,你將不得不使用特定於平臺的功能。 –
'printf'對面的'scanf' –