Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

C++ Programm

Hallo leute.
Ich soll mit den Befehlen fgetc, fputc, fread, fwrite usw. ein Programm schreiben, das eine Datei ließt, danach (vllt. verschlüsselt) und danach in eine neue Datei schreibt. Könnt ihr mir da irgendwie helfen. der anfang mit einlesen und ausgeben sieht so aus:

# include <iostream.h>
# include <stdio.h>
 
void main()
{  
   FILE *fp;
   fp=fopen ("datei.txt","r");

   if (fp == NULL)
      cout << "0" << endl;
           
   char c;
   do
   {
   c=fgetc (fp);
      cout << c;
   }
   while
      (c!=EOF);
   cout << endl << endl;
}


Antworten zu C++ Programm:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Nunja, eigentlich hast Du ja schon die Grundlagen zusammen. Nun musst Du nur beim Auslesen die ganze Datei einer Variable zuweisen (also den Inhalt), damit kannst Du dann Spaß machen und dann schreibst Du alles wieder in die Datei. Ungefähr so:

# include <iostream.h>
# include <stdio.h>
 
int main()
{
   char* inhalt = new char(255);
   int zeichen = 0;
   FILE *fp;
   fp=fopen ("eingabe.txt","r");
   if (fp == NULL)
   {
      cout << "Fehler beim Auslesen" << endl;
      exit(-1);
   }
   char c;
   do
   {
      c=fgetc (fp);
      cout << c;
      if(c!=EOF) inhalt[zeichen] = c;
      zeichen++;
   }
   while (c!=EOF);
   zeichen -= 1;
   cout << endl << endl;
   fclose (fp);
   //hier nun inhalt verschluesseln
   int i;
   for(i=0; i<zeichen; i++)
     inhalt[i] += 1;
   //und  in eine Datei schubsen
   fp = fopen ("encoded.txt" , "w");
   fwrite (inhalt , 1 , zeichen , fp);
   fclose (fp);
   //wieder entschluesseln
   for(i=0; i<zeichen; i++)
     inhalt[i] -= 1;
   //und wieder in eine Datei schubsen
   fp = fopen ("decoded.txt" , "w");
   fwrite (inhalt , 1 , zeichen , fp);
   fclose (fp);
   delete inhalt;
   getchar();
   return 0;
}

Das ist eine ganz simple (und sehr schlechte) Verschlüsselung. Die Buchstaben werden ausgelesen, der ASCII-Wert eins hochgesetzt und dann das Ganze in die encoded.txt gespeichert. Danach werden die Werte wieder eins erniedrigt und in decoded.txt gespeichert.
Es sind also die Grundlagen für Kodieren und Dekodieren drinne.

Gruß Spawn

EDIT: Momentan ist das ganze auf 255 Zeichen beschränkt, kannste aber in Zeile 6 ändern oder verbessern, in dem Du es flexibel machst.
« Letzte Änderung: 10.05.05, 13:54:30 von Spawn »

Hallo Spawn.

Ich hab ein kleines Problem. Ich möchte eine Textdatei auslesen, die eine 3x3 Matrix mit Kommazahlen enthält. Also zum Beispiel so eine Datei:

0.123 1.000 0.542
0.125 0.354 0.214
0.324 0.987 0.489


Dazu hab ich den Anfang deines Programms verwendet und ergänzt. Das ganze sieht jetzt so aus:

int MatrixDateiLesen()
{
  char* inhalt = new char(255);
  int zeichen = 0;
  FILE *fp;
  fp=fopen ("eingabe.txt","r+");
  if (fp == NULL)
  {
     cout << "Fehler beim Auslesen" << endl;
     return 1;
  }
  char c;
  do
  {
     c=fgetc (fp);
     cout << c;
     if(c!=EOF) inhalt[zeichen] = c;
     zeichen++;
  }
  while (c!=EOF);
  zeichen -= 1;
  cout << endl << endl;
  fclose (fp);

  Datei(inhalt); //Diese Funktion schreibt die Datei in eine, in 
                 //einer Klasse eingebunde Matrix
 
  return 0;
}

int Datei(char inhalt[255])
{
   
   char cWert[8];
   float Wert=0;
   int Zeichen=0,TSpalte=0,TReihe=0;
   for (int i=0; i<9; i++)
   {
      for (int j=0; j<=4; j++)
      {
           cWert[j]=inhalt[Zeichen];
         Zeichen++;
      }
      Zeichen++;
      Wert=atof(cWert);
      Matrix.set_DezMatrix_Wert(TReihe,TSpalte,Wert);
      if(TSpalte<2)
      {
         TSpalte++;
      }
      else if(TReihe<2)
      {
         TReihe++;
         TSpalte=0;
      }
   }
   return 0;
}



Klappt fast wunderbar, aber auch nur fast. Beim Debuggen gibt es keinerlei Probleme. Das Programm packt die Daten auch wunderbar in meine Matrix. Das Problem ist, dass wenn meine Datei mehr als 4 Werte (z.B. 0.123 1.000 0.542
      0.125)
hat während der Laufzeit folgende Meldung kommt:

"Unbehandelte Ausnahme bei 0x77f667cd in RS232.exe: Benutzerhaltepunkt."

klicke ich auf weiter kommt folgendes:

"Debug Assertion Failed!
 Programm: ...
 File: dgbheap.c

 Expression: _CrtIsValidHeapPointer

 ..."

Klicke ich dann auf Wiederholen kommt wieder die Haltepunktmeldung, dann nochmal die Debug Assertion Failed! Meldung und anschließend noch ein letzes Mal die Haltepunktmeldung. Klicke ich da dann nochmal auf Weiter kommt folgende Meldung:

"Unbehandelte Ausnahme bei 0x00442b72 in RS232.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0x38be5a10."

Ab diesem Zeitpunkt kann ich so oft auf Weiter klicken, wie ich will. Es kommt immer genau diese Meldung!

Was ist da falsch? Bitte um schnelle Hilfe! Bin schon am Verzweifeln!  :-\

PS.: Ich habe mir das ganze schon im Einzelschrittmodus angesehen. Der Fehler tritt bei der Zeile:
fclose (fp);
auf.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Tja, blöde Sache. Bei mir geht's :-\

Habe nur den Teil MatrixDateiLesen geprüft und das einzige, was ich verändert habe ist, dass ichs auf printf etc umgestellt habe, sollte also nix geändert haben.
Kanns Dir ja mal 1:1 geben und Du versuchsts mal erstal so:

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

int MatrixDateiLesen()
{
  char* inhalt = new char(255);
  int zeichen = 0;
  FILE *fp;
  fp=fopen ("eingabe.txt","r+");
  if (fp == NULL)
  {
     printf("Fehler beim Auslesen\n");
     return 1;
  }
  char c;
  do
  {
     c=fgetc (fp);
     printf("%c",c);
     if(c!=EOF) inhalt[zeichen] = c;
     zeichen++;
  }
  while (c!=EOF);
  zeichen -= 1;
  printf("\n\n");
  fclose (fp);

//  Datei(inhalt); //Diese Funktion schreibt die Datei in eine, in
                 //einer Klasse eingebunde Matrix
 
  return 0;
}

int main()
{
    MatrixDateiLesen();
    getchar();
    return 1;
}

Zum Testen habe ich Dein Beispiel genommen:
0.123 1.000 0.542
0.125 0.354 0.214
0.324 0.987 0.489

Wenn das bei Dir nicht geht, könntes was tiefergreifendes sein.

Gruß Spawn

Hallo,
ich muss ASCII-Dateien zeilenweise auslesen. In diesen Dateien stehen Kommentare und Anweisungen. Wie sieht der Quellcode für solch ein Problem aus? Meine Idee war, die Datei mit fopen() zu öffnen, dannach die erste zeile auslesen und vergleichen ob die ersten zeichen z.B. # sind, dann in die nächste zeile. Fängt aber die Zeile zb. mit "Name" an, so soll die Zeile in eine Andere Textdatei geschrieben werden. Ich bitte um Hilfe da ich ziemlich ratlos bin. Danke

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Nochmal langsam... :)

Die Datei sieht also zB so aus:

#100#90#80
Text-Bla
#40#25

Und was soll damit jetzt genau passieren?

Gruß Spawn

Ich habe auch ein kleines Problemm zu Lösen....Bin noch Laie bei C++ und wir müssen ein Projekt erstellen--heißt KONTO-- wo ich  beim Starten von Debuggen einen Namen eingeben kann...was heißt wenn ich Maier Hugo Blödi eingebe komme ich zu den einzelnen Konten wo ich dann meinen Pin eingeben muss,wieviel ich beheben will,und eine Summe was ich max beheben kann soll auch dabei sein.
Soll mit unterprg kombiniert werden.

Wäre gut bis Mittwoch wenn ihr mir den Fehler sagen könntet bis nach dem pin.(also bis zum pin)
--es sind Fehler in der Programmierung!

+Kleine Erklärungen dazu!!!!

danke im voraus


#include<iostream>

using namespace std;
char ant;


               //kontostruktur

   struct konto
   {
int nummer;
string name;
int pin;
long saldo;
int uezrahmen;

   };


               //Prototypen
void einzahlen(konto &k);      //übergabe mittels referenz---k heißt was


void main()
{

               //def.+dekl. der konten
   konto maier={1234,"Maier sepp",5989,1000,3000};
   konto hugo={1234,"hugo boss",5977,2000,5000};
   konto blödi={1234,"blödi",6307,7000,3000};
   cout<<maier.saldo<<endl;   
   einzahlen(maier);
   cout<<maier.saldo<<endl;
   
   
   
   
   
   //schleife-hauptmenü


   do
   {
   cout<<"Bitte namen eingeben um konto auszuwählen"<<endl;
   cin>>ant;
      switch(ant);
      {case '1':cout<<maier.name<<endl;
         
      case '2':cout<<hugo.name<<endl;
         
      case '3':cout<<blödi.name<<endl;
      };
      default: cout<<"falsche eingabe,diesen kontotyp gibt es nicht"<<endl;
   }while(ant=long x);      //long x

}





//Unterprogramme

void einzahlen(konto &k)
{
   k.saldo=2000;

}

 

Ich hatte heute meine 2. einheit Programmieren und da habe ich dieses Programm aufgekriegt

Schreiben Sie ein Programm das die ersten 100 Primzahlen berechnet.Verwenden sie dabei eine while-Schleife die abbricht sobald 100 Primzahlen ausgeschrieben wurden. Um zu testen ob eine zahl prim ist können Sie die modulo Division rest = a % b verwenden. Mit einer If- Anweisung prüft man dann ob rest == 0 . Wenn ja ist a durch b teilbar. Mit einer for-Schleife für b können sie alle möglichen Teiler b überprüfen.

Der Prof hat alles etwas zu schnell für meinen hübschen kopf erklärt
also was muss ich zuerst machen die if-anweisung die for-schleife oder die while schleife ??
ich bin total verwirrt und wäre über jede Hilfe glücklich

wir haben auch noch ne 2. aufgabe und da könnt ich auch jeden abküssen der mir irgendwie hilft

Ich soll ein Programm das die Einträge des Pascalschen Dreiecks für die ersten Zehn Zeilen berechnet schreiben. Dazu soll ich ein 2-dimensionales Feld
p[j] verwenden um das j-te Element in der i-ten Zeile abzuspeichern.

Ich würde gern mit 2 geschachtelten for-schleifen jeden Eintrag durch die benachbarten Einträge der (i-1)-ten Zeile gemäß p[j]=p[i-1][j-1] +p[i-1][j]

Da ich erst vor kurzem angefangen hab weiß ich nicht wo ich anfangen soll
 

..diese Programmieren basiert auf Mathematik oder..?
..in case of...while..repeat..until..End.   

« Letzte Änderung: 23.10.07, 14:16:51 von copy »

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Der Prof hat alles etwas zu schnell für meinen hübschen kopf erklärt
also was muss ich zuerst machen die if-anweisung die for-schleife oder die while schleife ??
ich bin total verwirrt und wäre über jede Hilfe glücklich

Naja, ganz aussen natuerlich die while-Schleife, dann ne for-Schleife ueber alle Teiler, und die Abfrage, ob es wirklich ne Primzahl ist mit if ganz innen, also etwa so:

VAR Zahl : Integer = 3 // Anfangswert
VAR AnzahlPrim : Integer = 0

WHILE wir noch keine 100 Primzahlen gefunden haben DO
    VAR prim : Boolean = true
    FOR VAR teiler : Integer = 2 TO Zahl/2 STEP 1 DO
        IF Zahl % teiler == 0
            prim = false
            break
        ENDIF
    ENDFOR
    IF prim
        AnzahlPrim++
        // evtl. Ausgabe oder Zahl abspeichern
    ENDIF
    Zahl++
ENDWHILE

« UART-Baustein und seine RegisterProgrammierungsprogramm kostenlos?? »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Internet-Zugriffsprogramm
Ein Internet-Zugriffsprogramm, auch Browser genannt, stellt Internetseiten für den Benutzer dar. Am bekanntesten ist der Microsoft Internet Explorer, gefolgt vom kos...

Programm
Siehe Software...

Auslagerungsdatei
Die Auslagerungsdatei, auch bekannt als virtueller Speicher, ist ein wichtiges Element im Windows-Betriebssystem. Sie dient als Erweiterung des physischen Arbeitsspeicher...