Zum Inhalt springen

Warum wird nur jede zweite Zeile gelesen?


Empfohlene Beiträge

Geschrieben

Hi,

ich schon wieder. Ich komme einfach nicht weiter. Sieht an dem Punkt wo ich nicht weiterkomme so aus:

cout << "Bitte geben Sie die List-Datei mit Pfad an: ";

cin >> Liste[scnt];

fy = fopen (Liste[scnt], "r");

if (fy == NULL)

cout << "Feler - List-Datei nicht gefunden!\n";

else

{

do

{

fgets (buffer3, 1000, fy);

_strlwr(buffer3);

strcpy(Datei[scnt], buffer3);

scnt++;

} while ((fgets (buffer3, 1000, fy))!= 0);

Warum liest er in Datei immer nur jede zweite Zeile aus der Datei ein?

Bine

Geschrieben

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock:

<STRONG>

  1		do

2		{

3		

4			fgets (buffer3, 1000, fy);

5			_strlwr(buffer3);

6			strcpy(Datei[scnt], buffer3);

7			scnt++;

8		} while ((fgets (buffer3, 1000, fy))!= 0);

</STRONG>

Geschrieben

Gut, also das mit dem auslesen klappt ja jetzt, aber wenn ich mehr als eine Datei (in mehr als einer Zeiler) in der List-Datei angebe, kann ich die Dateien nicht mehr öffnen.

Woran liegt das, denn die Position ist genau richtig.

Bine

Geschrieben

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock:

<STRONG>Ich habe keine Angst dass Du mich nicht findest, hast Du bisher ja immer geschafft. Ich bin wohl einfach zu dumm dazu.</STRONG>

Geschrieben

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock:

<STRONG>Gut, also das mit dem auslesen klappt ja jetzt, aber wenn ich mehr als eine Datei (in mehr als einer Zeiler) in der List-Datei angebe, kann ich die Dateien nicht mehr öffnen.

Woran liegt das, denn die Position ist genau richtig.</STRONG>

Geschrieben

Wie kann ich das checken? Wenn ich mir die einzelnen Arrays ausgeben lassen, in die ich mit fgets etwas gespeichert habe, dann gibt er mir genau die Zeilen die in meiner List-Datei stehen.

Soll ich also extra ein Nullzeichen anfügen? Aber warum klappt es dann wenn ich nur eine Datei in der Listdatei angeben? Fragen über Fragen und ich blicke schon fast nicht mehr durch...

Bine

Geschrieben

Das fclose() kommt bei mir ganz unten, ist hier nur nicht mit aufgeführt, weil ich noch einiges mehr drin habe in dem Programm, was für mein Problem aber nicht interessant ist, da dieses vorher auftritt.

Bine

PS: Aber wenigstens weißt Du das ich ein Vogel bin, und nicht z.B. das Festival...

Geschrieben

He Binchen,

also mit dem fclose() muss ich dem Uli recht geben :)

du hast im anderen Thread(ich denk einfach mal es ist das gleiche Programm) dass hier gepostet

 

for (j = 0; j < scnt-1; j++)

{

Gefunden = 2;

fz = fopen (Datei[j], "r");} 

dass heisst du oefnest mit dem Zeiger fz immer ne andere Datei...

ich kann mir nicht vorstellen dass das funktioniert

da musst du schon dazwischen diese Datei immer schliessen bevor du ne neue aufmachst

Geschrieben

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Woodstock:

<STRONG>

PS: Aber wenigstens weißt Du das ich ein Vogel bin, und nicht z.B. das Festival...</STRONG>

Geschrieben

Hi,

keine Ahnung ob das bei diesem Problem hift, aber:

1. Das verwenden sprechender Bezeichner schafft Verständnis

(fy ist eher unverständlich, zumindest aber nicht intuitiv verständlich)

Wie wäre es mit z.B. Datei01 statt fy ?

(es passiert mir zum Teil sonst auch, das ich es irgendwann nicht mehr verstehe, was ich da programmier habe)

2. Strings sind eine böse Falle! Denn ein String ist ein terminiertes Char-Array. Das heißt erst wenn ein x00 kommt ist der String zuende. (Da kann es dann auch schonmal schnell passieren das man über das eigendliche gedachte Ende hinausließt...==> Protection Exeption)

Also entweder als Chararray benutzen oder terminieren.

(z.B. durch vorinitialisierung memset(einlesebereich,0x00,<länge der Variablen> )

???geht die längen Bestimmung hier eigendlich mit sizeof???

(oder erhalte ich dann die größe des pointers?)

Greetz Ketzer

Geschrieben

Hi Woostock,

ich habe leider gerade keine C-Reference hier und auswenig kenne ich die Funktionen nicht alle.

Aber es gibt eine Funktion kbhit() die abprüft ob eine Taste gedrückt wurde. Anschließend kannst du das Zeichen dann auchlesen und mit \n vergleichen.

Aussehen müßte die Laufzeitbedingung ungefähr so:

while(!kbhit())

{

...

}

Aber warum machst du das nicht mit scanf()?

scanf(%s,&wohin_es_soll);

scanf beendet die Eingabe wenn entweder enter oder return gedrückt wurde.

Greetz

Ketzer

Geschrieben

Also, ich will dem User die Möglichkeit geben mehrere Suchbegriffe einzugeben, und ihm auch die Möglichkeit geben, das wenn er keinen weiteren Suchbegriff mehr eingeben möchte, er einfach nur 'Enter' drücken muss.

Ist das auch das was Du meinst?

Wenn ja, wie soll ich das mit scanf machen?

Bine

Geschrieben

Kuckuck,

Du koenntest eine main() mit variabler Parameterliste nehmen. Such Dir mal eine gute C-Beschreibung und sieh nach, wie man das macht. Hier im Forum hatten wir auch schonmal drueber diskutiert vor ein paar Wochen.

Ansonsten ist es besser, den ganzen Input-String auf einmal einzulesen und im Speicher die Suchbegriffe rauszuparsen.

Uli

Geschrieben

@ketzer:

Vorsicht - scanf() liest nur bis zum nächsten whitespace und läßt den Rest im Eingabepuffer stehen.

Wenn du also eintippst:

$ ene mene muh[enter]

und dies einliest mit

scanf("%s", mein_pointer_auf_char); // char* ist bereits eine Adresse...

dann ergibt

puts(mein_pointer_auf_char);

leider nur ein

$ ene

Und im Eingabepuffer liegt ein verwahrlostes "mene muh\n" (whitespaces übergeht scanf() ).

Sinnvoll für die Verwendung von scanf() wäre die Verwendung eines dynamischen Arrays von char* oder eine verkettete Liste, aber das wird hier vielleicht ein bißchen viel...

Wie Uli schreibt, ist es sinnvoller, die ganze Benutzerzeile in einen C-String einzulesen und dann intern nach den einzelnen Suchbegrffen zu parsen. Das erzähle ich ja eh immer mal wieder ;)

Das befreit natürlich nicht von dem Problem, wo man die Suchbegriffe hinterher hin tut.

Der Käptn

Geschrieben

Das Problem bei den C-Strings ist bei mir nur, das ich damit noch gar keine Erfahrungen gemacht habe, kommen in dem Buch aus dem ich lerne erst viel später, und ich damit deswegen gar nicht arbeiten kann. Steige da einfach nicht durch, wie ich was zu machen habe.

Dynamisches Array wollte ich am Anfang machen, aber mein Chef sagt, ich soll es ohne machen.

Bine

Geschrieben

@Woodstock:

Zu deiner eigentliche Frage: :D

a)

do..while ist meistens out...

B)

int c,i=0;

char buf[GROESSE];

// Zweite Schleifenbedingung reine Sicherheitsmassnahme...

while( ((c = getchar()) != '\n') && (i < (GROESSE-1) ) )

{ buf[i++] = c; }

buf = '\0'; // *sehr* wichtig !

Der Käptn

Geschrieben

Ach du meine Güte,

das geht bei dir ja überall und nirgends los... :eek:

Meine Meinung (sorry :) ) ist, daß man erstmal mit C halbwegs prozedural programmieren können sollte - und anders sieht dein Code bisher nicht aus - bevor man C++ Dinge benutzt, dazu zählt schon cin, cout... wobei cin dieselbe Problematik wie scanf() mt sich bringt :(

Und wenn du Suchgeschichten machst, halte ich es für geradezu notwendige Voraussetzung, daß du weißt, wie C-Strings aussehen , und dafür ist es wieder sinnvoll zu wissen, was in etwa ein Zeiger ist... (auf die Gefahr hin, dich zu entmutigen, ist aber nicht so gemeint) ;).

Aber du bist ja nicht alleine hier :)

Der Käptn

<FONT COLOR="#a62a2a" SIZE="1">[ 12. Oktober 2001 13:50: Beitrag 1 mal editiert, zuletzt von captain haddock ]</font>

Geschrieben

mal so ne frage dein array in dem du den pfad speichern willst... wie initialisierst du die variable?

entweder in einer schleife mit while ...

oder vielleicht mal so...

char pfad[256];

cin >> pfad;

oda in c,

scanf("%s", &pfad);

aber in c++ gibt's ne extra header namens fstream.h...

in c benutzt man einfach die stdio.h mit fopen....

ciao eax

ps: hoffe habe mich nicht vertippt oder sonst irgendwas..

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...