C++ Umschreiben einer Datei

CSCD

Newbie
Registriert
März 2014
Beiträge
4
Hallo,

ich bin blutiger Anfänger im Programmieren von C++. Für die Umsetzung einer txt Datei habe ich folgendes Programm geschrieben:

Code:
/* filesize.c
 * ermittelt mit Hilfe von fgetc()
 * die Größe einer Datei
 */
#include <stdio.h>     	/* u.a. wg. fgetc() */
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
 char PktNr[15];
 int  x, y, z, m, n;

 FILE *SampleFile,*OutputFile;

 unsigned long iNoRecords=0;

 /* Die symbolische Konstante FILENAME_MAX
  * steht für die maximal zulässige Länge
  * eines Dateinamens.
  */
 char *pszTemp, szFileName[FILENAME_MAX];

 OutputFile = fopen("c:\\aibel\\test.txt", "w");

  if( argc == 1 )
    {
    /* Wenn kein Dateiname als Kommandozeilen-
     * Argument übergeben wurde, einen solchen
     * interaktiv ermitteln.
     */
	  printf("Inputfile for transformation: ");
	  fgets( szFileName, FILENAME_MAX, stdin);
	  if( (pszTemp = strchr(szFileName, '\n')) != NULL )
         *pszTemp = '\0';
	}
 else
	strncpy(szFileName, argv[1], FILENAME_MAX);

   /* Datei für Lesen im Binärmodus öffnen */
   SampleFile = fopen( szFileName, "rb");

 if( SampleFile == NULL )
    {
	  printf("Non or incorrect file name entered", szFileName);
	  exit(EXIT_FAILURE);
	}

   /* Binärdateien enthalten in der Regel viele
    * EOF-Zeichen (z.B. unter DOS ASCII 26). Die
    * Anweisung while( fgetc(SampleFile) != EOF )
    * würde beim ersten solchen Zeichen abbrechen.
    * Die Funktion feof() hingegen gibt verläßlich
    * Auskunft über das tatsächliche Dateiende.
    */

  while( fscanf( SampleFile, "%s,%f,%f,%f,%f,%f", PktNr, x, y, z, m, n) != EOF)
  {

	iNoRecords++;

	 /* Ausgabe erfolgt in die Datei csv.dat */
	 fprintf(OutputFile, "*r%s\n   %f\n   %f\n   %f\n", PktNr, x, y, z);

  }
    printf("Number of transformed points: %d\n", iNoRecords);


   fclose(SampleFile);
   return 0;
 }
[CODE]

Das Programm funktioniert - leider sieht die Ausgabedatei nicht wie gewünscht aus - ich verzweifle an der Definition der Variablen :(. Deshalb zur Veranschaulichung die Eingabedatei. Die Angaben sind durch Komma voneinander getrennt und beschreiben folgende Eigenschaften in einer Zeile: Punktnummer, X-Wert(Kommazahl),Y-Wert(Kommazahl),Z-Wert(Kommazahl),Anzahl,Häufigkeit(Kommazahl)

100,45.875,38.723,21.312,2,0
1000,17.225,33.859,33.736,4,0.83
1001A,49.212,38.844,27.823,2,0.5

Die Ausgabedatei soll folgendermaßen aussehen - die letzten beiden Werte (Anzahl und Häufigkeit fallen weg):

*r100
   45.875
   38.723
   21.312
*r1000
   17.225
   33.859
   33.736
...usw.

Wäre echt super, wenn ich von jemanden Hilfe bekomme bezüglich der Umsetzung meines Projektes. Vielen Dank euch im Voraus :)
 
Zuletzt bearbeitet:
Bitte überarbeite erstmal deinen Post und nutze die Funktion "Code einfügen" um Quelltext zu posten, ansonsten bekommt man ja beim Durchlesen schon Augenkrebs ;-)

Bist du dir sicher, dass du C++ programmierst? Der gesamte Code macht nämlich einen reinen C und nicht C++ Eindruck
 
%s liest bis zum nächsten whitespace ein. Also deinen ganzen string.

add: beispiel
Code:
int main(int argc, char **argv)
{

FILE *SampleFile = fopen("test.txt", "rb");

char a[100];
char b[15];
float c,d,e,f,g;


while(fscanf( SampleFile, "%100s", a) != EOF)
{
	for(int n = 0; n < (int)strlen(a); n++) {
		if(a[n] == ',') {a[n] = ' ';}
	}
	sscanf(a, "%15s%f%f%f%f%f", b,&c,&d,&e,&f,&g);
	printf("%s\n%f\n%f\n%f\n...\n", b, c, d, e);
}
system("pause");
fclose(SampleFile);
return 0;
}
 
Zuletzt bearbeitet:
Code:
/* filesize.c
 * ermittelt mit Hilfe von fgetc()
 * die Größe einer Datei
 */
#include <stdio.h>     	/* u.a. wg. fgetc() */
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
 char PktNr[15];
 int  x, y, z, m, n;

 FILE *SampleFile,*OutputFile;

 unsigned long iNoRecords=0;

 /* Die symbolische Konstante FILENAME_MAX
  * steht für die maximal zulässige Länge
  * eines Dateinamens.
  */
 char *pszTemp, szFileName[FILENAME_MAX];

 OutputFile = fopen("c:\\aibel\\test.txt", "w");

  if( argc == 1 )
    {
    /* Wenn kein Dateiname als Kommandozeilen-
     * Argument übergeben wurde, einen solchen
     * interaktiv ermitteln.
     */
	  printf("Inputfile for transformation: ");
	  fgets( szFileName, FILENAME_MAX, stdin);
	  if( (pszTemp = strchr(szFileName, '\n')) != NULL )
         *pszTemp = '\0';
	}
 else
	strncpy(szFileName, argv[1], FILENAME_MAX);

   /* Datei für Lesen im Binärmodus öffnen */
   SampleFile = fopen( szFileName, "rb");

 if( SampleFile == NULL )
    {
	  printf("Non or incorrect file name entered", szFileName);
	  exit(EXIT_FAILURE);
	}

   /* Binärdateien enthalten in der Regel viele
    * EOF-Zeichen (z.B. unter DOS ASCII 26). Die
    * Anweisung while( fgetc(SampleFile) != EOF )
    * würde beim ersten solchen Zeichen abbrechen.
    * Die Funktion feof() hingegen gibt verläßlich
    * Auskunft über das tatsächliche Dateiende.
    */

  while( fscanf( SampleFile, "%s,%f,%f,%f,%f,%f", PktNr, x, y, z, m, n) != EOF)
  {

	iNoRecords++;

	 /* Ausgabe erfolgt in die Datei csv.dat */
	 fprintf(OutputFile, "*r%s\n   %f\n   %f\n   %f\n", PktNr, x, y, z);

  }
    printf("Number of transformed points: %d\n", iNoRecords);


   fclose(SampleFile);
   return 0;
 }

Hier mal probiert als Code einzufügen... Tja ich habe dies hier aus verschiedenen Seiten zusammen geschrieben. Kann stark sein, dass es sich hierbei um C handelt. Hoffe ich kann trotzdem auf deine Hilfe zählen....
 
Was Du zeigst ist reines "C". Darf es auch "C++" sein? Oder muss die "C"-Form so, wie Du es angefangen hast, eingelaten werden?

BTW: der Input ist so einfach, dass man eigentlich gar kein Programm braucht. In einer Shell kann man nur Perl und Kommandozeile folgendes machen:
Code:
 perl -F/,/ -lane 'print "*r",join"\n",@F[0..3]' test.txt
mit dem Resultat - ganz ohne Programm:
*r100
45.875
38.723
21.312
*r1000
17.225
33.859
33.736
*r1001A
49.212
38.844
27.823
 
Zuletzt bearbeitet:
Danke für den super Input, werde mal versuchen, dies so einzubauen. Dumme Frage eines Laien: Ist sicher schwer C und C++ zu vermischen. Ich habe immer mal wieder eine Ausgangsdatei in diesem Format, die umgewandelt werden soll. Deshalb habe ich gedacht, wäre es super ein kleines Programm zu haben, wo nur der Dateiname einzulesen wäre und man die Ausgangsdatei dann einfach abgreifen braucht.

Bis jetzt wurde es umständlich mit Editor Programmen und über Excel CSV Datein bewältigt :rolleyes:

Bis dahin habe ich es ja auch soweit hinbekommen. Leider ist die Defnition von Input und Output noch nicht ganz perfekt :)
Bin halt doch ein Anfänger !
 
Code:
    /* filesize.c
    * ermittelt mit Hilfe von fgetc()
    * die Größe einer Datei
    */
    #include <stdio.h> /* u.a. wg. fgetc() */
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char **argv)
    {
    char PktNr[15];
    int x, y, z, m, n;
     
    FILE *SampleFile,*OutputFile;
     
    unsigned long iNoRecords=0;
     
    /* Die symbolische Konstante FILENAME_MAX
    * steht für die maximal zulässige Länge
    * eines Dateinamens.
    */
    char *pszTemp, szFileName[FILENAME_MAX];
     
    OutputFile = fopen("c:\\aibel\\test.txt", "w");
     
    if( argc == 1 )
    {
    /* Wenn kein Dateiname als Kommandozeilen-
    * Argument übergeben wurde, einen solchen
    * interaktiv ermitteln.
    */
    printf("Inputfile for transformation: ");
    fgets( szFileName, FILENAME_MAX, stdin);
    if( (pszTemp = strchr(szFileName, '\n')) != NULL )
    *pszTemp = '\0';
    }
    else
    strncpy(szFileName, argv[1], FILENAME_MAX);
     
    /* Datei für Lesen im Binärmodus öffnen */
    SampleFile = fopen( szFileName, "rb");
     
    if( SampleFile == NULL )
    {
    printf("Non or incorrect file name entered", szFileName);
    exit(EXIT_FAILURE);
    }
     
    /* Binärdateien enthalten in der Regel viele
    * EOF-Zeichen (z.B. unter DOS ASCII 26). Die
    * Anweisung while( fgetc(SampleFile) != EOF )
    * würde beim ersten solchen Zeichen abbrechen.
    * Die Funktion feof() hingegen gibt verläßlich
    * Auskunft über das tatsächliche Dateiende.
    */
char a[100];
     while(fscanf( SampleFile, "%100s", a) != EOF)
{
for(int n = 0; n < (int)strlen(a); n++) {
if(a[n] == ',') {a[n] = ' ';}
}
 iNoRecords++;
sscanf(a, "%15s%f%f%f%f%f", , PktNr, &x, &y, &z, &m, &n);
 fprintf(OutputFile, "*r%s\n %f\n %f\n %f\n", PktNr, x, y, z);
}

    printf("Number of transformed points: %d\n", iNoRecords);
     
     
    fclose(SampleFile);
    return 0;
    }

ich habe auch nur c+p paste mit alldem hier geposteten gamacht. Und das hättest du auch können. Lern mal bitte Programmieren bevor du andere Programmieren lässt. Das was du gerade machst kommt nicht so arg gut an. Zumindest bei mir.
 
Ich kann mich bezüglich meinem Vorredner nur anschließen.

Du solltest, bevor du dir irgendwelche Schnipsel von Quellcode von verschiedenen Seiten her nimmst dir eine passende Lektüre zum Thema C++ kaufen / Oder dir passende Tutorials im Netz suchen.

Mit Büchern wirst du definitiv die beste Schiene Fahren - oft empfohlen der C++ Primer.

Es gibt auch "Thinking in C++" als kostenlose PDF aber in Englisch.
 
Danke euch allen für die Hilfe - besonders Tigerass 2.0 (hatte mich eigentlich schon mit deinem ersten Beitrag angefreundet) ! Buch liegt neben mir aber man findet halt nicht alles was man direkt zur Umsetzung braucht. Werde mich wohl noch intensiver damit beschäftigen müssen - trozdem Danke für die Hilfe von fachmännischer Seite.
 
Zurück
Oben