2017-09-24 2 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); 

を使用して

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

とし、POSIX準拠のシステムでは、Windowsで標準出力に記述する必要があり、決してポートGetStdHandleWriteFile Unixに接続したり、writeをWindowsや他のシステム(Solarisなど)に移植することはできません。ラッパー関数を書こうと思っていても、標準化されたライブラリを使うよりも苦労します。

P.S.後者は0、1、2


を必要とするDWORD nStdHandle WinAPIのパラメータを使用すると、一見単純な何かをしようとしても、あなたがやってしまいます、それぞれ、旧requires -10, -11 and -12 for stdin/stdout/stderrint fd UnixのAPIが異なります残業。

標準化:

#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()使用するたとえば、

を:標準化された方法を使用してファイルディスクリプタから

読み取り

関連する問題