2017-09-24 2 views
-3

Ich kann Zeile auf Konsole mit printf drucken. Aber wie liest man Zeile ohne std Bibliothek?Zeile von Konsole ohne STD lesen

+1

Warum ohne die Standardbibliothek? – Rakete1111

+3

'std' gibt Ihnen die Garantie, dass es plattformübergreifend funktioniert. Sie müssen plattformspezifische Funktionen verwenden, wenn Sie sie nicht verwenden möchten. –

+1

'scanf' gegenüber von 'printf' –

Antwort

1

standardisierte Methoden verwenden, wird Ihr Code garantiert werden tragbar sein über verschiedene Plattformen. Ohne das müssen Sie Code für jede Plattform schreiben, die Sie anvisieren möchten.

printf und scanf, std::cout und std::cin und std::cerr bietet portable Möglichkeiten, um stdout/lesen von stdin/schreiben zu stderr zu schreiben. Wenn Sie dies vermeiden wollen, müssen Sie schreiben in Windows stdout mit

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

und in einem POSIX-konformes System von

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

Sie sehen, man kann nie Port GetStdHandle und WriteFile zu Unix, noch können Sie write zu Windows oder einem anderen System (wie Solaris) portieren. Selbst wenn Sie gerne Wrapper-Funktionen schreiben möchten, wäre das viel mühsamer als standardisierte Bibliotheken.

P.S. Der DWORD nStdHandle WinAPI Parameter unterscheidet sich von der int fd Unix-API, die ehemalige requires -10, -11 and -12 for stdin/stdout/stderr sind, während letztere benötigt 0, 1 und 2.


Auch wenn Sie versuchen, etwas scheinbar einfach zu tun, werden Sie am Ende tut Extra Arbeit. Zum Beispiel:

Standardisierte:

#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)); 

Fenster:

#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 
); 

Eigentlich müssen Sie selbst die Zeichenfolge analysieren, wenn Sie nicht wollen, Verwenden Sie Standardfunktionen. Ich benutzte snprintf/strlen für einfache Illustration, aber das ist sicherlich ein bisschen mehr Arbeit.

0

Die Standardbibliothek bietet Methoden, die garantiert plattformübergreifend sind, und wird daher empfohlen, sie zu verwenden.

Wenn nicht, müssten Sie spezifischen Code schreiben, der auf eine Plattform abzielt.

Zum Beispiel, wenn Sie Linux-Ziel wollen, dann würden Sie verwenden read():

Lesen aus einem Dateideskriptor