Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

zulesende Datei zu klein?

5 views
Skip to first unread message

Burghammer Manuel

unread,
Mar 20, 2002, 6:08:21 AM3/20/02
to
Hallo,

ich hab folgenden Codeausschnitt:

void textConvert(int postlen, char textId[31], char session[31], char
art[3]){
FILE *textFile;
int letter;
int letters=0;
int count=0;
int lines=0;
int pages=1;
int maxSize=postlen+10;

char command[10000];
char fullPath[200];
char owner[31];

char *text;
char heading[101]="";

MYSQL *tmsql;

getId(owner, session);
tmsql = mysql_init(NULL); // mySQL-Objekt Initialisieren
sprintf(fullPath, "%s/%s.txt", temporaryPath, textId); //
Kompletten Dateipfad erzeugen

if(!(text = (char*)malloc(maxSize))){ // Reichlich Speicher
reservieren
fprintf(stdout, "Fehler: malloc->text");
exit(1);
}
if(!(textFile = fopen(fullPath, "r"))){ // Textfile öffnen
printf("Textfile nicht Vorhanden\n");
exit(1);
}
else
fprintf(stdout, "File erfolgreich geöffnet<br>\n");

fprintf(stdout, "File: %s<br>\n", fullPath);

while((letter = fgetc(textFile)) != '\n' && strlen(heading) <= 101)
// Überschrift extrahieren
sprintf(heading, "%s%c", heading, letter);
// fprintf(stdout, "%c", letter);

fprintf(stdout, "<br><br>Überschrift: <b>%s</b><br><br>\n", heading);

----------------------------------------------------------------

Jetzt besteht folgendes Problem .das die Datei eine gewisse grösse nicht
UNTERschreiten bdarf, sonst wird die Datei nicht ausgelesen. Im char
"heading" steht dann nur wirres Zeug.

Sieht irgendwer irgendwo nen fehler? ich bin mit meiner weisheit am ende :o(

System: Linux (suse 7.2)
Aufruf über webbrowser

thx4hlp

MfG Manuel

--
F-TECC Multimedia -- Softwareentwicklung -- Webdesign -- www.f-tecc.com
--> http://www.Gewinn24.de/index.php3?partner=14681
--> http://profiseller.de/shop/P3179008
--> http://www.writehere.de --> http://www.EssenAmChiemsee.de


Heinrich Schramm

unread,
Mar 20, 2002, 7:14:40 AM3/20/02
to
"Burghammer Manuel" <m.burg...@f-tecc.com> wrote:

> while((letter = fgetc(textFile)) != '\n' && strlen(heading) <= 101)

> sprintf(heading, "%s%c", heading, letter);
>

> fprintf(stdout, "<br><br>Überschrift: <b>%s</b><br><br>\n", heading);
>
>----------------------------------------------------------------
>
>Jetzt besteht folgendes Problem .das die Datei eine gewisse grösse nicht
>UNTERschreiten bdarf, sonst wird die Datei nicht ausgelesen. Im char
>"heading" steht dann nur wirres Zeug.

Kann es sein, dass die Datei eventuell kein '\n' enthaelt? Du rufst
fgetc solange auf, bis Du ein Newline liest. fgetc kann aber im
Fehlerfall oder bei Dateiende auch EOF zurueckliefern. In diesem Fall
sollte man mit feof pruefen, ob das Dateiende wirklich erreicht ist (und
dann keine weiteren Leseversuche mehr unternehmen).

Ausserdem hast Du Deinen Buffer mit

> char heading[101]="";

deklariert. Du liest bei fehlendem newline aber solange neue Zeichen
ein, bis strlen(heading) groesser als 101 ist. Wenn man die
abschliessende 0 mitberuecksichtigt, ist IMHO der Buffer also um zwei
Byte zu klein.

Gruss Heiner

Georg Kreyerhoff

unread,
Mar 20, 2002, 7:43:26 AM3/20/02
to
Burghammer Manuel schrieb:
>
> Hallo,
>
>[...]

>
> while((letter = fgetc(textFile)) != '\n' && strlen(heading) <= 101)
> // Überschrift extrahieren
> sprintf(heading, "%s%c", heading, letter);
> // fprintf(stdout, "%c", letter);
>

Bizarre Methode, eine Zeile aus einer Datei zu lesen.



> fprintf(stdout, "<br><br>Überschrift: <b>%s</b><br><br>\n", heading);
>
> ----------------------------------------------------------------
>
> Jetzt besteht folgendes Problem .das die Datei eine gewisse grösse nicht
> UNTERschreiten bdarf, sonst wird die Datei nicht ausgelesen. Im char
> "heading" steht dann nur wirres Zeug.
>


ich weiss nicht, was der C-Standard dazu sagt, aber kann es sein, dass
das Verhalten von sprintf undefiniert ist, wenn man in den String reinschreibt,
den man gleichzeitig in der Liste der zu schreibenden Variablen hat?

Warum verwendest Du nicht fgets(), um eine Zeile zu lesen?


> Sieht irgendwer irgendwo nen fehler? ich bin mit meiner weisheit am ende :o(
>
> System: Linux (suse 7.2)
> Aufruf über webbrowser
>

Da sollte man natuerlich besonders drauf achten, sauber zu programmieren.

Georg

Jens Schweikhardt

unread,
Mar 20, 2002, 10:35:57 AM3/20/02
to
Georg Kreyerhoff <ge...@lemnatec.de> wrote
in <3C9883EE...@lemnatec.de>:
...
# ich weiss nicht, was der C-Standard dazu sagt, aber kann es sein, dass
# das Verhalten von sprintf undefiniert ist, wenn man in den String reinschreibt,
# den man gleichzeitig in der Liste der zu schreibenden Variablen hat?

Ja, ISO C99 7.19.6.6 The sprintf function
...
If copying takes place between objects that overlap, the behavior is
undefined.

Regards,

Jens
--
Jens Schweikhardt http://www.schweikhardt.net/
SIGSIG -- signature too long (core dumped)

Burghammer Manuel

unread,
Mar 20, 2002, 2:08:27 PM3/20/02
to
Hallo,

> Ja, ISO C99 7.19.6.6 The sprintf function
> ...
> If copying takes place between objects that overlap, the behavior is
> undefined.

wie löse ich das dann ansonsten? bin auf nix vernünftigesd gekommen bisher.


Burghammer Manuel

unread,
Mar 20, 2002, 2:10:38 PM3/20/02
to
Hallo,

> Warum verwendest Du nicht fgets(), um eine Zeile zu lesen?

Damit gets auch nicht. Ausserdem hab ich das Problem, das im text
verschidene Zeichen ersetzt werden müssen, deshalb das Zeichenweise
einlesen.

> > System: Linux (suse 7.2)
> > Aufruf über webbrowser
> >
> Da sollte man natuerlich besonders drauf achten, sauber zu programmieren.

Tja...ich lerne noch, werd mich aber bemühen :o)

MfG Manuel


Burghammer Manuel

unread,
Mar 20, 2002, 2:14:21 PM3/20/02
to
Hallo,

>Kann es sein, dass die Datei eventuell kein '\n' enthaelt? Du rufst
>fgetc solange auf, bis Du ein Newline liest. fgetc kann aber im

Da ist ein \n, wenn ich die gleiche Datei verlängere, klappt ja alles.

>Fehlerfall oder bei Dateiende auch EOF zurueckliefern. In diesem Fall
>sollte man mit feof pruefen, ob das Dateiende wirklich erreicht ist (und
>dann keine weiteren Leseversuche mehr unternehmen).

s.o. Nach der ersten Zeile folgt ne leerzeile und dann nochmal ein text. Und
der muss mindestens ca. 4000 Byte lang sein, sonst gibts Probleme.

>Ausserdem hast Du Deinen Buffer mit
> char heading[101]="";
>deklariert.

Hab ich gesehen, aber die erste Zeile ist bisher maximal 40 Zeichen lang.
Daran sollte es also nicht liegen.

Kann es wirklich am sprintf liegen?
Dann muss ich mir dafür mal was anderes einfallen lassen.

MfG Manuel


Felix von Leitner

unread,
Mar 20, 2002, 3:08:08 PM3/20/02
to
Thus spake Burghammer Manuel (m.burg...@f-tecc.com):

> wie löse ich das dann ansonsten? bin auf nix vernünftigesd gekommen bisher.

Geh doch am besten in eine Windoze Programmierer-Gruppe und unterhalte
dich da mit den Visual Sonstwas Hax0rn.

Heinrich Schramm

unread,
Mar 20, 2002, 3:43:26 PM3/20/02
to
"Burghammer Manuel" <m.burg...@f-tecc.com> wrote:

>>Kann es sein, dass die Datei eventuell kein '\n' enthaelt? Du rufst
>>fgetc solange auf, bis Du ein Newline liest. fgetc kann aber im
>
>Da ist ein \n, wenn ich die gleiche Datei verlängere, klappt ja alles.

Gut. Trotzdem sollte man auch auf EOF pruefen. Ich kenne zwar Deinen
Anwendungsfall nicht, aber sich auf die Integritaet der Eingabedaten zu
verlassen, ist kein besonders guter Programmierstil.

>Kann es wirklich am sprintf liegen?

Moeglich. Ich habe das so noch nie verwendet, deshalb kann ich Dir auch
nicht sagen, ob das Fehlerbild eventuell passen koennte.

>Dann muss ich mir dafür mal was anderes einfallen lassen.

Wie schon jemand geschrieben hat: Da Du sowieso eine ganze Zeile
einliest, nimm doch einfach fgets statt fgetc:


if (!fgets(heading, sizeof(heading), textFile))
if (feof(textFile))
printf("End of file.\n");
else
printf("Error reading file.\n");
else
{
/* Weiterverarbeitung von heading... */
}


Gruss Heiner

Burghammer Manuel

unread,
Mar 20, 2002, 6:56:53 PM3/20/02
to
Hallo,

> Geh doch am besten in eine Windoze Programmierer-Gruppe und unterhalte
> dich da mit den Visual Sonstwas Hax0rn.

Könnte probleme machen, da meine Server alle unter Linux laufen......
Aber schön das es so hilfsbereite leute wie dich gibt......wenn alle so
wären könnte sich die leute die hilfe sucher erschiessen......


Burghammer Manuel

unread,
Mar 20, 2002, 6:55:05 PM3/20/02
to
Hallo,

>Gut. Trotzdem sollte man auch auf EOF pruefen. Ich kenne zwar Deinen
>Anwendungsfall nicht, aber sich auf die Integritaet der Eingabedaten zu
>verlassen, ist kein besonders guter Programmierstil.

Die Datei wird vorher von einer Subroutine auf die Festplatte geschrieben.
Die Daten kommen über stdin per POST über einen Webbrowser.

>Wie schon jemand geschrieben hat: Da Du sowieso eine ganze Zeile
>einliest, nimm doch einfach fgets statt fgetc:

Bringt mir nix, weil ich unterm einlesen diverse Zeichen ersetzen muss. z.b.
>, <, deutsche Umlaute......

Ausserdem gehts mit fgets genausowenig...hab ich shcon versucht.....


Erich Frühstück

unread,
Mar 21, 2002, 11:58:49 PM3/21/02
to
In article <a7amn7$f4l$1...@news.dtag.de>, "Burghammer Manuel"

Tipp:

heading[n++] = letter;

Grüße
Erich
--
EFEU is great (development tools, C libraries, interpreter language, ...).
Get the open source from http://efeu.cybertec.at now.

Heinrich Schramm

unread,
Mar 22, 2002, 6:33:51 AM3/22/02
to
"Burghammer Manuel" <m.burg...@f-tecc.com> wrote:

>Die Datei wird vorher von einer Subroutine auf die Festplatte geschrieben.

Bist Du sicher, dass dort das fclose auch immer richtig aufgerufen wird?

Gruss Heiner

Manuel Burghammer

unread,
Mar 22, 2002, 9:41:59 AM3/22/02
to
Hallo,

> Bist Du sicher, dass dort das fclose auch immer richtig aufgerufen
> wird?

Yepp.....hab ich einige mal überprüft.....

0 new messages