Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]1131[/thread]

Ungepufferte Ausgabe in C



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
J-jayz-Z
 2005-07-05 00:39
#11228 #11228
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi, ich hab mit C jetzt angefangen und habe folgendes folgendes Problem: Wie kann ich eine Ausgabe über printf unepuffert ausgeben? So wie $| = 1; in Perl. Hier mein Problemscript:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <time.h>

int main() {
int i;
time_t time1, time2;
for(i = 0; i < 10; i++) {
time(&time1);
do
{
time(&time2);
} while( (time2 - time1) < 1);
printf("%i ", i);
if(i == 9) {
printf("\n");
}

}

return (1);
}


Weiß jemand Rat? Thx schonmal
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
esskar
 2005-07-05 01:19
#11229 #11229
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[s]hmm... wie kommst du darauf, dass es gepuffert wird?[/s]

welches betriebssystem benutzt du?
versuch mal
Code: (dl )
fflush(stdout);

nach jedem printf!\n\n

<!--EDIT|esskar|1120512214-->
J-jayz-Z
 2005-07-05 01:45
#11230 #11230
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich nutze Linux. Dank dir, so geht es!
Aber wenn es nicht gepuffert wird, was wird es dann?
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
esskar
 2005-07-05 01:46
#11231 #11231
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=J-jayz-Z,04.07.2005, 23:45]Aber wenn es nicht gepuffert wird, was wird es dann?[/quote]
nee... unter windows läuft das ganze ohne fflush...
wahrscheinlich kann man das flushing auch global setzen, aber da ich es unter windows nicht brauche, hab ich grad keine ahnung wie
SirLant
 2005-07-06 16:03
#11232 #11232
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Da stoudt auch "nur" eine Instanz der FILE Struktur ist müsste es mit einem setbuf( stoudt, NULL ); gehen.
Kann das unter Windows jedoch schlecht testen, da es hier keine Pufferung gibt wie esskar bereits erwähnte.
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
docsnyder
 2006-05-02 18:27
#11233 #11233
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn ich mich recht erinnere, kann man das auch mit fcntl() machen. Ist lange her, daß ich sowas schon mal gemacht habe und ich weiß leider die Parameter nicht mehr. Aber fflush() tut's natürlich auch (kommt auf die spezielle Anforderung an), wie Esskar schon sagt. ... und die Variante mit setbuf() sollte auch funktionieren.

Für das Schreiben in Files gilt: open() (low-level)statt fopen() (high-level) verwenden, dann geht's ungepuffert.

Gruß, Doc
betterworld
 2006-05-02 22:46
#11234 #11234
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=docsnyder,02.05.2006, 16:27]Wenn ich mich recht erinnere, kann man das auch mit fcntl() machen.[/quote]
Das glaube ich nicht. fcntl agiert auf Kernel-Ebene, Puffern passiert aber auf libc-Ebene.
docsnyder
 2006-05-02 23:49
#11235 #11235
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Quote
Das glaube ich nicht. fcntl agiert auf Kernel-Ebene, Puffern passiert aber auf libc-Ebene.


... bin mir aber ziemlich sicher, das ich das damals mit fcntl() gemacht habe. Wenn nicht, dann war es select(), aber mit einem von beidem ging es definitiv.

Gruß, Doc
murphy
 2006-05-03 08:24
#11236 #11236
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Man sollte da unterscheiden zwischen dem Caching, das der Kernel eventuell vornimmt und der Pufferung durch den stdio-Layer. Außerdem sollte man sich gut überlegen welche Funktionen man benutzt, wenn man auf Portabilität Wert legt.

* Die ganze Familie der fopen, fclose, fread, fwrite, fprintf, ... Funktionen ist ANSI-C, wohingegen die open, close, read, write, ... Funktionen nur POSIX-Standard sind.

* Verwendet man die low-level POSIX-Funktionen, so hat man natürlich keine Pufferung, verwendet man die ANSI-C stdio-Funktionen, so hat man Pufferung.

* Ob die Pufferung standardmäßig für Dateien, die mit fopen geöffnet werden, oder für stdin und stdout aktiv ist, ist systemabhängig.

* Auf jeden Fall kann man aber mittels der ANSI-C Funktionen setbuf oder setvbuf die Pufferung durch den stdio-Layer pro FILE * explizit an oder ausschalten. Das sollte auch unter Windoof funktionieren.

* fflush verhindert nicht die Pufferung, leert aber die Puffer. Nach jedem Schreibvorgang ein fflush auszuführen, die Pufferung aber zu aktivieren ist also Perls $| = 1 am ähnlichsten.

* fcntl ist eine low-level Funktion, die mit Pufferung gar nichts zu tun hat und obendrein extrem unportabel ist. Bei einigen Betriebssystemen kann man allerdings über fcntl-Aufrufe das Caching auf Kernellevel für eine Datei deaktivieren oder eine Synchronisation des Dateisystemes erzwingen.

* select hat mit der ganzen Geschichte nun wirklich nichts zu tun. Das ist nur für I/O-Multiplexing gedacht und wird noch manchmal für präzises Timing verwendet.
When C++ is your hammer, every problem looks like your thumb.
ptk
 2006-05-03 09:40
#11237 #11237
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=murphy,03.05.2006, 06:24]* fcntl ist eine low-level Funktion, die mit Pufferung gar nichts zu tun hat und obendrein extrem unportabel ist. Bei einigen Betriebssystemen kann man allerdings über fcntl-Aufrufe das Caching auf Kernellevel für eine Datei deaktivieren oder eine Synchronisation des Dateisystemes erzwingen.[/quote]
Zum Beispiel bei BSD. Aus der Manpage:
Code: (dl )
1
2
3
4
5
6
     O_DIRECT     Minimize or eliminate the cache effects of reading and writ-
ing. The system will attempt to avoid caching the data you
read or write. If it cannot avoid caching the data, it will
minimize the impact the data has on the cache. Use of this
flag can drastically reduce performance if not used with
care.
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2005-07-05 00:39.