2017-09-24 8 views
-3

Je peux facilement imprimer la ligne sur la console avec printf. Mais comment lire la ligne sans bibliothèque std?Lire la ligne de la console sans STD

+1

Pourquoi sans la bibliothèque standard? – Rakete1111

+3

'std' est ce qui vous garantit que cela fonctionnera sur toutes les plates-formes. Vous allez devoir utiliser des fonctions spécifiques à la plateforme si vous ne voulez pas l'utiliser. –

+1

'scanf' à l'opposé de' printf' –

Répondre

1

En utilisant des méthodes normalisées, votre code sera garanti pour être portable sur différentes plates-formes. Sans cela, vous devez écrire du code pour chaque plateforme que vous voulez cibler.

printf et scanf, std::cout et std::cin et std::cerr fournit des moyens portables d'écrire à stdout/lecture de stdin/écrire à stderr. Si vous voulez éviter cela, vous pouvez avoir à écrire stdout dans Windows avec

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

et dans un système conforme aux spécifications POSIX en utilisant

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

Vous voyez, vous ne pouvez jamais le port GetStdHandle et WriteFile à Unix, ni vous pouvez porter write à Windows ou un autre système (comme Solaris). Même si vous êtes désireux d'écrire des fonctions wrapper, ce serait beaucoup plus difficile que d'utiliser des bibliothèques standardisées.

P.S. Le DWORD nStdHandle paramètre WinAPI est différent de l'API Unix int fd, l'ancien requires -10, -11 and -12 for stdin/stdout/stderr, respectivement, alors que celui-ci nécessite 0, 1 et 2.


Même si vous essayez de faire quelque chose en apparence simple, vous finirez par faire travail supplémentaire. Par exemple:

normalisé:

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

Fenêtres:

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

En fait, vous avez à analyser la chaîne par vous-même si vous ne voulez pas utiliser des fonctions standard. J'ai utilisé snprintf/strlen pour une illustration facile mais sûrement c'est du travail supplémentaire.

0

La bibliothèque standard fournit des méthodes dont la compatibilité avec la plate-forme est garantie, il est donc conseillé de l'utiliser.

Si ce n'est pas le cas, vous devez écrire un code spécifique qui cible une plate-forme.

Par exemple, si vous souhaitez cibler Linux, vous utilisez read():

lecture d'un descripteur de fichier