C Text zeichenweise aus Datei auslesen

neRo1508

Cadet 1st Year
Registriert
Jan. 2015
Beiträge
9
Hallöchen,
ich bin relativ neu im Umgang mit C, daher bitte ich um eure Hilfe.

Es geht darum, dass ich gerne von einer schon existierenden Textdatei den Text zeichenweise in ein Array speichern möchte. Das Ganze soll aber nur bis zum Ende der Zeile gemacht werden.
Der Grund für die das zeichenweise Auslesen ist, dass ich den Text zeichenweise ausgeben möchte, damit ich durch ein if bestimmte Zeichen überspringen kann.

Nun habe ich mir gedacht, dass ich mir den Text in ein char array, sagen wir, mit der Größe 1024, zeichenweise bis zum Ende der Zeile einlese. Das Ende der Zeile wird als Bedingung beim Einspeichern in das char array festgelegt.
Ich habe das ganze schon versucht mit fgetc, aber damit hatte ich bisher keinen Erfolg.

Könnte mir da jemand bei helfen oder vielleicht sogar ein Code-Beispiel liefern?

Liebe Grüße,
neRo1508
 
Code-Beispiele gibt's gut Dokumentiert im Netz zuhauf ;) Wäre gut zu wissen was genau bei fgetc nicht funktioniert hat. Compiler Error, falscher output?
 
Wie wäre es mit den Code den Du geschrieben hast, der Beispieldatei und was daran nicht wie gewünscht funktioniert.
 
Code:
/*VOKABELABFRAGE*/
void Vokabelabfrage(FILE *text){		/*Textdatei wird aus void main übergeben*/
	char buffer2;

	while ((buffer2 = fgetc(text)) != EOF){			
		printf("%c", buffer2);
	}
}

Damit müsste ich ja schonmal nur den Text aus der Datei ausgegeben bekommen, aber die Konsole bleibt leer.
Keine Fehler gar nichts. Er spuckt mir einfach keinen Text aus.
 
Liegt sicherlich am Dateizugriff. Der Filepointer "text" , ein sehr schöner Name übrigens, ist nicht zufällig NULL ? Zeig mal noch die Stelle, an der du die Datei öffnest.
 
Poste doch mal den gesamten Code und nicht nur so ein Fressding.

Ansonsten, welches Betriebsystem, welcher Compiler?

Habe gerade das hier getestet (VS2010 Ultimate unter Windows 8.1 Enterprise), es tut:

Code:
// Test123.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"


int _tmain(int argc, _TCHAR* argv[])
{
	int c;
	FILE *ptr;

	ptr = fopen("D:/Temp/AdobeARM_NotLocked.log","r");
	while ((c = fgetc(ptr)) != EOF)
	{
		printf("%c",c);		/* O/P the character to the screen	*/
	}

	fclose(ptr);
	
	return 0;
}
 
Zuletzt bearbeitet:
Code:
#define  _CRT_SECURE_NO_DEPRECATE

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void Vokabelabfrage(FILE *text);

void main(){
	FILE *text;
	char vokliste[100];
	char buffer[1024];
	char check;

	/*AUSWAHL DER VOKABELLISTE*/
	printf("Bitte waehlen Sie eine Vokabelliste aus.\n\n");
	printf("1) Vokabelliste: Positive Gefuehle(Englisch)[liste01.txt]\n");
	printf("2) Vokabelliste: Negative Gefuehle(Englisch)[liste02.txt]\n\n");
	printf("Bitte geben Sie den Namen in der eckigen Klammer \nhinter der gewuenschten Liste ein und bestaetigen Sie mit ENTER:\n");
	printf("--");
	scanf_s("%s", &vokliste, 100);

	/*ÖFFNEN DER VOKABELLISTE*/
	text = fopen(vokliste, "r");
	printf("\nDie Vokabelliste wird nun ausgegeben. (Mit ENTER bestaetigen.)\n\n");
	_getch();

	while (fgets(buffer, 1024, text)){		/*Ausgabe der gesamten Liste*/
		fputs(buffer, stdout);
	}

	/*TEST STARTEN?*/
	printf("\nSoll die Vokabelabfrage gestartet werden <j/n>?\n");

	{
		check = _getch();
	} while (check != 'j' && check != 'n');

	if (check == 'j'){
		Vokabelabfrage(text);
	}

	printf("\nDas Programm wird nun beendet.\nBitte bestaetigen Sie dies mit ENTER.");
	fclose(text);
	_getch();
}

void Vokabelabfrage(FILE *text){
	int twv = 0;				/*"TESTWIEDERHOLVARIABLE"*/
	char check2;
	char buffer2=fgetc(text);
	char übersetzung[1024];
	{
		printf("Fuer die Vokabelabfrage wird die Konsole nun geleert. \nBitte bestaetigen Sie dies mit ENTER.\n");
		_getch();
		system("cls");

		/*An dieser Stelle soll die Ausgabe der ersten deutschen Vokabel erfolgen*/
		/*Nach der Eingabe der Übersetzung wird diese zeichenweise durch den Vergleich von char arrays überprüft*/
		/*Das Ganze soll so oft gemacht werden bis die Liste abgearbeitet ist*/

		while (buffer2)
		printf("Soll der Test wiederholt werden <j/n>?");
		{
			check2 = _getch();
		} while (check2 != 'j' && check2 != 'n');

		if (check2 == 'j'){
			twv = 1;				/*Falls der Test wiederholt werden soll wird die Testwiederholvariable auf 1 gesetzt und die Schleife wird wiederholt*/
		}

	} while (twv > 0);
}

Hier ist der gesamte Code. Es fehlt noch ein ganzes Stückchen, wo die entsprechenden Kommentare sind. Aber ich hoffe, dass das mit eurer Hilfe was wird.
 
Entweder lässt du die Ausgabe der gesamten Liste vorher weg, oder du machst ein fseek(text, 0, SEEK_SET ); bevor du in die Vokabelabfrage(text) springst.
 
Habe es mit demm fseek probiert. Er gibt nun die Datei aus, danke dafür! Nun habe ich das Problem, dass der aller erste Buchstabe weggelassen wird. So sieht die Ausgabe bei einem Originaltext ("blabla") so aus: "labla".
 
In Zeile 51 deines geposteten Codes initialisierst du die Variable buffer2 bereits mit fgetc(text). An dieser Stelle rückt der File-Pointer um '1' weiter.
 
Das ist nun die Vokabelabfrage.

Code:
while ((buffer2 = fgetc(text)) != EOF){			/*Bis zum Ende der Vokabelliste*/
				
/*Solange TAB nicht erkannt wurde, wird jedes Zeichen geschrieben*/
	if (buffer2 != 9){							/*ASCII CODE 9 = TAB (Alle Vokabeln und ihre Übersetzungen sind durch ein TAB getrennt)*/
		printf("%c", buffer2);					/*Ausgabe der Vokabel, die übersetzt werden soll*/
	}

/*Sobald TAB erkannt wird, wird die Übersetzung gefordert und die richtige Übersetzung wird danach ausgegeben, um zu vergleichen*/
	if (buffer2 = 9){
		printf("\nÜbersetzung: ");
		scanf("%c", &übersetzung);					/*Eingabe der Übersetzung*/


		printf("\nIhre Übersetzung: ");				/*Ausgabe der eigenen Übersetzung*/
		int i = 0;
		while (übersetzung[i] != EOF){
			printf("%c", übersetzung[i]);
			i++;
		}


		printf("\tRichtige Uebersetzung: ");		/*Ausgabe der richtigen Übersetzung*/
		while ((buffer2 = fgetc(text)) != 10){		/*ASCII CODE 10 = NEW LINE*/
			printf("%c", buffer2);
		}
		printf("\n");
	}

So müsste es doch dann gehen?
Nun habe ich das Problem, dass nachdem das Zeichen ausgegeben wurde, schon das zweite if ausgeführt wird. Dazu wird mein scanf im ersten Durchgang komplett übergangen.

PS: Der Grund warum ich nach einem TAB suchen lasse ist, dass ich alle Vokabeln in der Textdatei durch ein TAB getrennt habe.
 
Zuletzt bearbeitet:
Vorsicht in Zeile 9:

Code:
buffer2 = 9;

Denk mal darüber nach was das bewirkt. Ich denke du willst einen logischen Vergleich machen.

Wenn du dir angewöhnst die Konstanten auf die linke Seite zu schreiben, meckert auch gleich der Compiler falls du das zweite '=' vergisst.

also lieber:

Code:
 if ( 9 == buffer2 ) 
{
.
.
.
}
Ergänzung ()

Noch eine Anmerkung:

Klar kann man einen Vergleich auf dezimaler Basis machen wie z.B.
Code:
 if  ( buffer2 != 9 )

Da du aber auch die Escape-Sequenzen beim printf verwendest, warum nicht auch hier. Es wird dann deutlich einfacher lesbar:

Code:
 if  ( '\t' ==  buffer2  ) ...     // Check for tab 
 if  ( '\n' ==  buffer2  ) ...     // Check for newline
 
Ah, super, danke!

Jetzt habe ich noch das Problem, dass beim ersten Durchgang der while-Schleife mein scanf komplett übergangen wird. Wieso ausgerechnet nur beim ersten Durchgang?
 
Das verstehe ich noch nicht ganz. Das "scanf" macht er doch nur, wenn ein Tab erkannt wird. Da das erste Wort kein Tab-Zeichen enthält, muss er es doch überspringen!?
 
Also das erste Wort wird standardmäßig geschrieben. Dann erkennt er das Tab, weswegen er "Übersetzung: " ausgibt, hier überspringt er aber das scanf und will direkt "Ihre Übersetzung: " ausgeben, mit der Ausgabe von dem "scanf-array". Danach gibt er die richtige Übersetzung ohne Fehler aus. Erst bei der zweiten Vokabel funktioniert das scanf, wobei die Ausgabe spinnt.

Der Code sieht jetzt folgendermaßen aus:

Code:
void Vokabelabfrage(FILE *text){
	int twv = 0;										/*"TESTWIEDERHOLVARIABLE"*/
	char check2;
	char buffer2;
	char übersetzung[100];
	
	while (twv > 0); {
		printf("Fuer die Vokabelabfrage wird die Konsole nun geleert. \nBitte bestaetigen Sie dies mit ENTER.\n");
		_getch();
		system("cls");
		printf("Die Vokabelabfrage startet nun:\n\n");


		while ((buffer2 = fgetc(text))!=EOF){			/*Bis zum Ende der Vokabelliste*/
				

			/*Solange TAB nicht erkannt wurde, wird jedes Zeichen geschrieben*/
			if (buffer2 != '\t'){						/*TAB (Alle Vokabeln und ihre Übersetzungen sind durch ein TAB getrennt)*/
				printf("%c", buffer2);					/*Ausgabe der Vokabel, die übersetzt werden soll*/
			}

			/*Sobald TAB erkannt wird, wird die Übersetzung gefordert und die richtige Übersetzung wird danach ausgegeben, um zu vergleichen*/
			if (buffer2 == '\t'){
				printf("\nUebersetzung: ");
				scanf("%c", &übersetzung);					/*Eingabe der Übersetzung*/

				printf("\nIhre Uebersetzung: ");				/*Ausgabe der eigenen Übersetzung*/
				int i = 0;
				while (übersetzung[i] != EOF){
					printf("%c", übersetzung[i]);
					i++;
				}


				printf("\tRichtige Uebersetzung: ");		/*Ausgabe der richtigen Übersetzung*/
				while ((buffer2 = fgetc(text)) != '\n'){	/*NEW LINE*/
					printf("%c", buffer2);
				}
				printf("\n");
			}

		}
		printf("\nSoll der Test wiederholt werden <j/n>?");
		{
			check2 = _getch();
		} while (check2 != 'j' && check2 != 'n');

		if ('n' == check2){
			twv = 1;									/*Falls der Test wiederholt werden soll wird die "Testwiederholvariable" auf 1 gesetzt und die Schleife wird wiederholt*/
		}

	}
	fclose(text);
}

Und die Ausgabe in der Konsole sieht so aus:
asugabefehler.jpg
 
Schau dir mal deinen scanf() Aufruf an. Was macht ein "%c" scanf specifier ?
 
Das wirst du uns dann sagen :)
 
Habs gerade ausprobiert. Nun funktioniert der scan direkt auch beim ersten mal. Das printf muss aber bei %c bleiben. Mit %s wurde mir eine Fehlermeldung ausgespuckt. Weshalb hab ich allerdings nicht so ganz verstanden :D

Es funktioniert nun wirklich alles reibungslos, so wie ich es im Code habe. Ein riesiges Dankeschön dafür!!!
 
Gern geschehen. Bei dem printf muss es ein "%c" bleiben weil du ja zeichenweise arbeitest / ausgibst .
 
Zurück
Oben