2015-05-14 8 views
7

Ich benutze eine Bibliothek, die printf eine Fehlermeldung ausgibt, wenn eine Verbindung zu einem Gerät nicht erfolgreich ist. Der Bibliothekscode gibt nichts aus, wenn eine Verbindung erfolgreich ist.Programmatisch Ignoriere printf

Ich regelmäßig überprüfen (Schleife & Schlaf), um zu sehen, ob ein Gerät verbunden ist, aber ich möchte nur ausdrucken, wenn es verbunden ist.

Im Moment bekomme ich so etwas wie:

Waiting for connection... (<-- My print) 
Error 
Error 
Error 
Error 
Error 
Connection successful (<-- My print) 

Was ich will, ist:

Waiting for connection... (<-- My print) 
Connection successful (<-- My print) 

Wie kann ich einen printf programmatisch ignorieren?

N.b. Ich fand eine ähnliche Frage Programmatically Ignore Cout, aber diese Lösung funktionierte nicht für printf.

Ich benutze Windows.

Kann jemand helfen? (C/C++ Anfänger)

+0

ich diese Frage erraten fallen könnte unter mehreren Tags c, C# vielleicht? Kann jemand bearbeiten, wenn das der Fall ist? (Ich hatte nur Erfahrung mit c & C++) –

+2

@Ke vin: Nein, tag die Sprache, die Sie tatsächlich verwenden, nicht jede Sprache, die Konsolenausgabe unterstützt. –

+0

Danke Ich war mir nicht sicher. –

Antwort

2

Haben Sie versucht, so etwas wie (vor Verbindungsaufbau):

FILE * myout = stdout; 
stdout = fopen ("standard-output-file", "w"); 

etwas zur Ausgabe drucken können Sie dann verwenden:

fprintf(myout, "format", ...); 

Edit: Denken Sie daran, um den Dateideskriptor danach zu schließen:

fclose(myout); 
+0

Ich möchte nicht in eine Datei drucken (wenn ich Sie richtig verstanden habe), ich möchte printfs provisorisch ignorieren. –

+1

@KevinPaton Ja, aber Sie könnten z.B./dev/null als Ausgabe, wenn Sie in Linux sind, was äquivalent wäre zu Ignorieren ... –

+0

@KevinPaton andererseits würde alles, was auf 'myout' geschrieben wird, in der Standardausgabe wie erwartet angezeigt werden ... –

0

ich war der Lage, diese Arbeiten unter Linux

#include <cstdio> 

using namespace std; 

int main() { 
    printf("Start\n"); 
    freopen("/dev/null", "w", stdout); 
    printf("middle\n"); 
    freopen("/dev/stdin", "w", stdout); // really stdin here! 
    printf("End\n"); 
    return 0; 
} 

unter Windows die folgende Art und Weise gibt es denke ich, um andere Namen für Dateien (nul und con vielleicht).

Dies scheint jedoch vollständig nicht portierbar, und was noch schlimmer ist, wird die Benutzer daran hindern, Ihre Programmausgabe in eine Datei umzuleiten, weil ich explizit /dev/stdin wieder öffnen. Es gibt Vorschläge, dass Sie /dev/fd/1 statt /dev/stdin verwenden können, um das letztere Problem zu mildern, aber ich habe es nicht getestet.

Es scheint, dass es keinen zuverlässigen Weg gibt, siehe z.B. http://c-faq.com/stdio/undofreopen.html

+0

http://StackOverflow.com/a/13817208/153285 sollte zuverlässig und ungefähr so ​​portabel wie dieses sein. – Potatoswatter

+0

Sie können stdio auch umleiten, indem Sie das Programm in einem Bash/Batch-Skript ausführen. – deek0146

+0

Es ist die Implementierung definiert (nicht überall ist stdout eine zuweisbare FILE *). Darüber hinaus muss OP es in Windows tun ... –

0

Ich weiß nicht, die absolute Lösung, aber Sie werden verwenden müssen:

freopen("conout$", "w", stderr); 

Oder etwas Ähnliches, aber mit „CONOUT $“ pseudo-Datei, die ich glaube, ist die gleiche als /dev/stdout unter Linux.

Sie haben GetStdHandle, verwenden AttachConsole usw.

0

Wenn Sie mit C++ 11 und über Ihnen eine einfache variadische Vorlage verwenden können ohne Codierung viel so Überlastungen dieser printf für alle Fälle und das Original wird nie genannt

template <typename ...Args> 
void printf(Args... ...) 
{ 
} 
+0

Es wird nicht in 3rd-Party-Bibliothek (es sei denn, sie tun printf in ihren Headern). –

+0

es sei denn, er kann es neu kompilieren. trotzdem habe ich geschossen. – tejas