[C] Datei öffnen und Zeichen ausgeben

PatrickB

Well-known member
ID: 137508
L
24 April 2006
496
13
Hi,

ich versuch gerade mit C (nicht C++) eine Datei zu öffnen und den Inhalt auszugeben. Eigentlich funktioniert das ja auch, aber da erscheinen dann immernoch so merkwürdige Striche? oder sowas. Das hängt mit dem "char text[100]" zusammen, aber irgendwie find ich nich raus wie ich das ändern kann. Es sind ja nicht immer gleich viele Zeichen in einer Datei und ich will immer alle ausgeben die darin sind.

Hab mal ein Bild angehängt mit dem Code. (Erstellen klappt)



Hab das übrigens von hier: https://de.wikibooks.org/wiki/C-Programmierung:_Dateien
 
In C wird ein String durch ein abschließendes Null-Zeichen \0 (ASCII 0) terminiert. printf() gibt solange Zeichen aus, bis das Null-Zeichen gefunden wird. Du hast keines gesetzt, also rauscht printf() durch und gibt dir die nachfolgenden Bytes im String mit aus.
 
In C wird ein String durch ein abschließendes Null-Zeichen \0 (ASCII 0) terminiert. printf() gibt solange Zeichen aus, bis das Null-Zeichen gefunden wird. Du hast keines gesetzt, also rauscht printf() durch und gibt dir die nachfolgenden Bytes im String mit aus.

Okay, und wie sollte ich das jetzt setzen?
Wenn ich es so setze:

Code:
printf ("%s\0\n", text);

Dann werden die Bytes ja trotzdem mit ausgegeben weil sie schon in dem char text stecken. Und bei fscanf weiß ich nich wie ich das setzen soll. Wenn ich das %100c rausmache wird garnixmehr angezeigt, wenn ich es danach setze werden trotzdem die 100 Zeichen inklusive Bytes ausgegeben.
 
Was spricht gegen ein einfaches
Code:
while(zeichen=getc(stream) != EOF) {
  printf("%c", zeichen);
}

Sollte so funktionieren ;)
 
Hab noch ne kurze Frage.

Wenn ich jetzt versuche eine Datei zu öffnen die in einem Ordner liegt der einen Namen mit einem Leerzeichen hat(z.B. "Bilder Urlaub") dann wird nix geöffnet. Was muss ich da machen wenn ein Leerzeichen vorkommt?
 
Wenn du auf einer Windows-Plattform entwickelst, musst du den Dateinamen in Anführungszeichen setzen:
PHP:
FILE* fp=fopen("\"C:\\Bilder Urlaub\\dummy.gif\"","rb");
if(!fp) {
  printf("Cannot open file.\n");
  return 255;
}
(ungetestet)
 
Wenn du auf einer Windows-Plattform entwickelst, musst du den Dateinamen in Anführungszeichen setzen:
PHP:
FILE* fp=fopen("\"C:\\Bilder Urlaub\\dummy.gif\"","rb");
if(!fp) {
  printf("Cannot open file.\n");
  return 255;
}
(ungetestet)

Habs so mal versucht. Also dann mit
Code:
 "\"C:\\Dokumente und Einstellungen\\.....\\Desktop\\datei.txt\""
klappt so aber irgendwie nicht mit dem "\ .
Hier mal noch der Code so wie ich ihn eigentlich haben will:

PHP:
#include <stdio.h>
#include <string.h>

int main (void)
{

  FILE *datei;
  char text;
  char source[50];
  //size_t zeichen;
  char string[20]="red dwarf";

  printf("Pfad zur Quelle angeben: ");
  scanf("%s", &source);

  datei = fopen (source, "rb");
  if (datei != NULL)
    {
      while((text=getc(datei)) != EOF) 
      {
        printf("%c", text);
      }
      //zeichen = strlen(text); //klappt auch nicht, wegen dem "text". wenn ich eine normale char Variable definiert habe (z.B. char string[20]="test";) klappts aber
      //printf ("\nDie Datei beinhaltet %d Zeichen", zeichen);
      fclose (datei);
    }
  return 0;
}
 
Was das komische Betriebssystem mit Leerzeichen in Dateinamen tut, kann ich leider nicht sagen, aber strlen auf eine char-Variable wird nicht funktionieren. strlen ermittelt die Position des ersten Vorkommens eines Nullbytes in einem char-Array (statisch: char[irgendwas] oder char*). Speziell für deinen Fall würde es ausreichen, einen int bei jedem Schleifendurchlauf im Block mit dem printf um eins hochzählen zu lassen und die Variable am Schluss auszugeben.
 
aber strlen auf eine char-Variable wird nicht funktionieren. strlen ermittelt die Position des ersten Vorkommens eines Nullbytes in einem char-Array (statisch: char[irgendwas] oder char*). Speziell für deinen Fall würde es ausreichen, einen int bei jedem Schleifendurchlauf im Block mit dem printf um eins hochzählen zu lassen und die Variable am Schluss auszugeben.

Doch, bei mir gehts ja wenn ich es mit dem mache: char string[20]="red dwarf";
Wenn ich dann zeichen = strlen(string); mache und "zeichen" ausgeben lasse kommt das Ergebnis 9 raus. Also kanns daran ja eigentlich nicht liegen
 
Doch, bei mir gehts ja wenn ich es mit dem mache: char string[20]="red dwarf";
Wenn ich dann zeichen = strlen(string); mache und "zeichen" ausgeben lasse kommt das Ergebnis 9 raus.
Also ich hab mal gelernt, dass das nicht so ganz sauber is.
Diese Deklaration scheint das Null-Zeichen wohl zu setzen.

Ich kenne 3 Varianten, wie man einen String deklariert und initialisiert:
PHP:
// Variante 1
char string[10]; // 9 Bytes + 1 Byte Nullzeichen
strcpy(string,"red dwarf");

// Variante 2
char* string;
string=malloc(10);
if(!string) return -1;
strcpy(string,"red dwarf");

// Variante 3; C++
char* string=new char[10];
if(!string) return -1;
strcpy(string,"red dwarf");

// strcpy setzt jeweils string[9]='\0'
Warum das mit den Anführungszeichen nicht funktioniert, kann ich dir leider nicht weiterhelfen. Ich hab damals noch schön brav 8.3-Dateinamen benutzt :mrgreen: