Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Warum wird nur jede zweite Zeile gelesen?

Empfohlene Antworten

Veröffentlicht

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

<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>

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

Bine

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

<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>

<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>

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

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...

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

<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>

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

Ich habe es soweit heute geschafft. Bin einen Schritt weiter, danke Euch! :)

Bine

Moin, moin!

Kann mir einer sagen wie die Bedingung einer 'do while' Schleife sein muss, in der etwas in eine char Array eingelesen wird, damit sie abbricht, wenn nur 'Enter' gedrückt wurde?

Bine

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

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

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

@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

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

@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

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>

captain haddock: bitte einmal in den Thread 'Ausgabe nur einmal schaun'!

Danke

Bine

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..

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.