[ansi C]Einlesen einer Textdatei

Anime-Otaku

Erfahrenes Mitglied
Hallo,

ich komme eigentlich aus der Java-ecke will aber zu C/C++ gehen. Ich hab da mal angefangen ein kleines Java Progrämmchen nach C zu portieren. Momentan soll es nur jedes eingelesene Zeichen wieder als Zeichen auf der Konsole ausgeben.

Das kommt raus wenn ich den Sourcecode(siehe unten) dazu versuche einzulesen:
Code:
D:\blub\src>.\bin.exe main.c lol
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
???????????????????????????????????????????????????

Ich benutze den gcc Compiler.

Dies ist der src dazu:
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]);
int printHelp(const char* mes);

int main(int argc, char *argv[]) {
	if (argc!=3 || strcmp(argv[1],"")==0 || strcmp(argv[2],"")==0 ) {
		printHelp("Didn't found any arguments");
		return 1;
	}
	FILE *fp;
	char cha=0;
	if (fp=fopen(argv[1],"rt")) {
		while(cha=fgetc(fp)!=EOF){
			printf("%c",cha);
		}
		puts("");

		if (fclose(fp)==EOF) {
		printf("\nFehler beim Schließen der Datei %s!\n",argv[1]);
		return -1;
		}
	} else {
		printf("\nFehler beim Öffnen der Datei %s!\n",argv[1]);
		return -1;
	   }
	}

int printHelp(const char* mes){
	printf("%s\nUse: bin [input file] [output file]\n",mes);
	return 0;
}

Vielen Dank schonmal für die Hilfe
 
Narf, es ist echt noch zu früh am Morgen.

Also das erste, was mich stutzig macht, ist der Parameter des fopen, das "rt". "r" für "read" leuchtet mir ein, aber was soll das "t" bedeuten?
Ansonsten wird es ohne Debugger knifflig. Ich will es nicht verschreien, aber das sieht für mich nach einem Konvertierungsproblem zwischen Windows-Zeichensatz und ASCII aus. Muß das mal evtl. selber nachprüfen.
 
Ok, ich kenne es nur ohne "t". Höchstens noch "b" für binary. Dann mal eine kurze Frage:
Du schreibst, daß du den gcc benutzt, aber die Syntax des Aufrufs sieht sehr nach Windows aus. Auf was für einer Plattform arbeitest du? Evtl. kann ich das Programm mal kurz nachbauen und schauen, was passiert.
 
Ja momentan arbeite ich auf nem windows Rechner, aber ich will es auch unter Linux zum laufen bekommen, aber ich hatte noch keine Gelegenheit es zu testen.

Ich benutze den GCC Compiler aus dem MingW Projekt. Version 3.4.2, welcher bei Dev-cpp dabei ist.
 
Ok, ich hab's rausgefunden, war etwas fieser. :-)
Der Wurm liegt hier:
Code:
while(cha=fgetc(fp)!=EOF){
  printf("%c",cha);
Was du machen willst ist:
cha den Character aus dem Stream zuweisen und dann mit EOF vergleichen.
Was tatsächlich passiert:
Der Character aus dem Stream wird mit EOF verglichen und cha wird das Vergleichsergebnis zugewiesen. ;-]

Deswegen bin ich auch kein sonderlicher Freund von solchen Superkurzschreibweisen.
Dieser Code funktioniert:
Code:
if (fp=fopen(argv[1],"r")) {
  while(cha!=EOF){
    cha=fgetc(fp);
    printf("%c",cha);
  }
  puts("");
...

Nicht zuviel kürzen, dann kommt man auch nicht mit den Auswertungsprioritäten in Konflikt. :-)
 
Zurück