Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Als Textdatei geöffnetes File wird binär gespeichert

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.06.2009, 22:17 Uhr
Yadgar



(anscheinend ist es wohl doch kein Linux-spezifisches Problem, also versuche ich mein Glück mal hier...)

High!

Da bin ich wieder... nachdem mein Projekt "Yadgar's Image Processor" (siehe auch www.khyberspace.de/comput-d.html) bis auf weiteres auf Eis liegt, versuche ich seit einigen Tagen, ein C++-Programm zur Erzeugung von PoV-Ray-Skripts zum Laufen zu bekommen.

Das Programm "makemm" (mm steht für "MyMaglev", ein futuristisches Kabinenbahnsystem für ein noch auszuprogrammierendes Science-Fiction-Stadtszenario - eine allererste kleine Animation habe ich bei YouTube eingestellt, www.youtube.com/watch?v=9eSzGZTBv44 ) erzeugt ausgehend von den beim Aufruf des Programmes übergebenen vier Parametern ( xyz-Koordinaten des Startpunkts der Bahnstrecke, azimutale Ausrichtung des ersten Streckensegments in Grad) und einem eingelesenen Beschreibungsskript für die Abfolge der Streckensegmente die PoV-Ray-Programmstruktur für eine Kamerafahrt entlang dieser Bahnstrecke (vorerst mit konstanter Geschwindigkeit, später soll noch eine externe Skriptsteuerung für die Geschwindigkeit hinzukommen).

Da sowohl PoV-Ray-Skripte als auch das Hilfsskript mit den Streckensegmenten einfacher ASCII-Text sind, öffne ich sowohl das Eingabe- wie das Ausgabefile ohne ios::binary. Trotzdem schreibt mein Programm aber anscheinend eine Binärdatei als Ausgabefile, denn wenn ich die vom Programm erzeugte Datei mit Kwrite öffne, bekomme ich eine Warnmeldung: "Die Datei ist binär, das Speichern wird zu einer fehlerhaften Datei führen". Wieso?

Hier der C++-Code:



C++:
#include <iostream>
#include <stdlib.h>
#include <cstdlib>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

int main(int argc, char* argv[])
{
  double x, y, z, d;
  
  x = atof(argv[1]);
  y = atof(argv[2]);
  z = atof(argv[3]);
  d = atof(argv[4]);
  
  ifstream track;
  string track_name;
  
  cout << "Track script? ";
  cin >> track_name;
  
  track.open(track_name.c_str());
  
  if (!track)
  {
    cerr << track_name << " cannot be opened!\n";
    exit (-1);
  }
  
  ofstream anim;
  string anim_name;

  char ch;
  vector<char> puffer;
  short segments=1; // last line MUST NOT end with a \n !
  
  while (track.get(ch))
  {  
    puffer.push_back(ch);
    if (ch == '\n') segments++;
  };
  
  
  track.close();
  
  cout << "Animation script? ";
  cin >> anim_name;
  
  anim.open(anim_name.c_str());
  
  if (!anim)
  {
    cerr << anim_name << " cannot be opened!\n";
    exit (-1);
  }
  

  
  anim.write("#declare trans_general = <", 26);
  anim.write(argv[1], sizeof(argv[1]));
  anim.write(", ", 2);
  anim.write(argv[2], sizeof(argv[2]));
  anim.write(", ", 2);
  anim.write(argv[3], sizeof(argv[3]));
  anim.write(">;\n", 3);
  anim.write("#declare d_general = ", 21);
  anim.write(argv[4], sizeof(argv[4]));
  anim.put(EOF);



/*
#declare i=0; // loop counter
#declare trans=trans_general; // position of first rail segment (center of front side)
#declare d=d_general; // orientation (degrees) of first rail segment
*/

  
  
  return 0;
}




Das Skript für die Streckensegmente:

0,20,0,
1,45,15,
0,15,0,
1,-45,15,
0,30,0,
1, 120, 15,
0, 25, 0,
0, 40, 0,
1, 60, 15,
0, 35, 0,
1, 90, 15,
0, 12.1495153401, 0,
1, -45, 15,
0, 20, 0,
1, -45, 15,
0, 40, 0,
1, 180, 15,
0, 25, 0,
1, -45, 15,
0, 15, 0,
1, 45, 15,
0, 13.0025254703, 0

(Zur Erklärung: die erste Zahl in jeder Zeile bezeichnet den Typ des Segments, 0 = Gerade, 1 = Kurve; die zweite Zahl bezeichnet bei Geraden die Länge in Metern, bei Kurven die Winkelgröße in Grad; die dritte Zahl wird bei Geraden ignoriert, bei Kurven bezeichnet sie den Radius in Metern)

Muss bei der gegenwärtigen Version des g++ bei Textdateien ein expliziter Schalter, etwa ios::text (oder so ähnlich) angegeben werden?

Bis bald im Khyberspace!

Yadgar

P. S. Meinen Avatar müsste ich auch mal aktualisieren...
--
Flagmaker - ein Programmier-Blog

Dieser Post wurde am 17.06.2009 um 22:17 Uhr von Yadgar editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.06.2009, 23:23 Uhr
Kest
saint


Hi!

Versuch mal die ganze Ausgabe-Routine umzuschreiben. So etwas anim.put(EOF); trifft man eher selten Wird wohl auch nicht als end-of-file interpretiert.

C++:
anim << "#declare trans_general = <"
     << argv[1] << ", "
     << argv[2] << ", "
     << argv[3] << ">;\n"
     << "#declare d_general = "
     << argv[4];

--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.06.2009, 23:28 Uhr
Hans
Library Walker
(Operator)


Hi,

ich bin mir nicht ganz sicher, aber ich vermute, das es ein C++ problem ist, und zwar in der write-funktion von ofstream. Möglicherweise muss da noch eine Konvertierung nach ASCII-Code rein. Oder das muss über die ios-bits festgelegt werden.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.06.2009, 23:35 Uhr
Yadgar




Zitat von Kest:

Versuch mal die ganze Ausgabe-Routine umzuschreiben. So etwas anim.put(EOF); trifft man eher selten Wird wohl auch nicht als end-of-file interpretiert.



Also, bei uns im Hindukusch... (Scherz am Rande)



Zitat von Kest:


C++:
anim << "#declare trans_general = <"
     << argv[1] << ", "
     << argv[2] << ", "
     << argv[3] << ">;\n"
     << "#declare d_general = "
     << argv[4];



Klar, ist ja nicht umsonst ein ofstream-Objekt... dass ich da nicht gleich drauf gekommen bin liegt an meiner immer noch vergleichsweise geringen C++-Erfahrung!

Aber eines irritiert mich allerdings schon: argv[] ist ja ein Array von Zeigern auf char, oder anders ausgedrückt, ein Array von char-Arrays - schließlich können ja beliebig viele durch Leerzeichen getrennte Strings als Parameter übergeben werden. Trotzdem bekomme ich beim Schreiben mit put den ganzen Eingabe-"String" schon mit argv[1], obwohl das Feld doch in meinem Fall bis Index 4 geht... während in Ausgabestreams, sowohl zur Konsole als auch in die Datei, die Leerzeichen als Trenner wirken - wieso?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.06.2009, 23:49 Uhr
Kest
saint


Ich ahne, was du meinst. Gib aber den Code dazu, um nicht auf was Falsches zu kommen.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: