2010-12-08 6 views
1
while((reader=fread(array, sizeof(char), size, stdin))>0) 

Ich habe diese Art von Wache rufen, was ich brauche in diesem Zyklus ist, wenn ich eine Funktion, die ich simulieren wollen rufen, dass ich meine fread etwas gebe.C- Need stdin innerhalb des Codes zu simulieren, wenn eine Funktion

Sorry über das unheimliche Englisch.

+5

'sizeof (char)' ist garantiert 1 nach dem C-Standard. Wenn Sie den Code flexibel halten möchten, können Sie 'sizeof array [0]' schreiben, was sich entsprechend ändert, wenn Sie den Typ des Arrays ändern. Ansonsten würde ich nur 1 verwenden. (Aber es ist persönliche Vorliebe.) –

Antwort

1

Sie können stdin mit einem FILE * Ihrer Wahl zum Testen ersetzen:

FILE *test = fopen("mytestFile.txt", "r"); 
/* your code here... */ 

Oder wenn Bedarf von stdin:

FILE *test = stdin; 
/* your code here... */ 
+0

Wie kann ich dies mit meiner Wache in der Ausführungszeit arbeiten lassen, sagen wir, ich rufe ich SIGINT und ich möchte aus meiner Weile herauskommen, aber ich warte auf die stdin input ... – Unzi

+0

Sie könnten die Dateien O_NONBLOCK öffnen oder select (2) oder poll (2) verwenden. Diese funktionieren jedoch nur mit einfachen FDs. Sie können die FD von einer FILE * mit der Funktion fileno (3) erhalten. Siehe die Manpages für mehr;) –

+3

oder, man könnte sogar 'freopen' auf' stdin' nennen. Nicht für Produktionscode empfohlen, obwohl es in einem Komponententest nützlich sein könnte. –

2

@ Fritschy Antwort mit @ Ben Voigt Kommentar bilden die tragbare Lösung .

Wenn Sie auf Unix/Linux sind/ähnlich, können Sie tatsächlich die Dinge in stdin schreiben von

int p[2]; 

// error return checks omitted 
pipe(p); 
dup2(p[0], STDIN_FILENO); 

FILE *stdin_writer = fdopen(p[1], "w"); 

Jetzt in stdin_writer schreiben.

Siehe pipe, dup2, fdopen im POSIX-Standard.