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
Répondre
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.
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
Pourquoi sans la bibliothèque standard? – Rakete1111
'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. –
'scanf' à l'opposé de' printf' –