Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausgabe von C++ Programm Ausdrucken.
Daepilin
18.03.2007, 09:35
Hi Leute!
Ich hab für meine Mutter ein kleines Programm geschrieben( via C++ ohne WinApi o.ä.), das verschiedene Rechnungen durchführt. Wie kann ich nun, diese Ergebnisse der Rechnungen Ausdrucken lassen? Am besten weiterhin ohne WinApi.
wurzel^2
18.03.2007, 09:44
http://www.tutorials.de/forum/c-c/132608-visual-c-drucken-aus-dialogbasierenden-anwendung.html
google hat bei mir folgendes ausgespuckt ;)
Daepilin
18.03.2007, 09:54
Soweit ich das gesehen hab geht das nur, wenn man was Grafisches( in WinApi o.ä.) hat. Ich hab allerdings alles in der Konsole und möchte es so machen, das nachdem das Ergebnis ausgerechnet wurde gefragt wird, ob gedruckt werden soll.
PS: Ich möchte vier cout Ausgaben Ausdrucken lassen.
Chocwise
18.03.2007, 13:10
Ich geh also recht in der Annahme, dass du ein Commandlinetool geschrieben hast.
Nujo, dann ists doch eigentlich recht simpel.
Angenommen das Programm heißt "rechnungen". Man übergibt die zu berechnenden Werte als Argumente:
rechnungen -b="7633*93,5"
Um nun die Ausgabe drucken zu können, würde ich vorschlagen du leitest die Ausgabe in eine Datei um. Das geht so:
rechnungen -b="7633*93,5" > datei.txt
Wenn das Programm aber ein interaktives Welches ist, weiß ich auch nicht weiter.
Wie kann ich nun, diese Ergebnisse der Rechnungen Ausdrucken lassen? Am besten weiterhin ohne WinApi.
Das wird nicht gehen. Der Drucker kann drucken, kann aber keine Druckaufträge verwalten. Für das Verwalten von Druckaufträgen ist das Betriebssystem zuständig. Stell dir vor der Drucker druckt gerade und jemand sendet einen weiteren Druckauftrag zum Drucker. Es würde Mist rauskommen. Deshalb ist es in modernen (Multitasking-)Betriebssystemen für Anwendungsprogramme nicht möglich, den Drucker direkt anzusprechen. Um aber auf die Druckwarteschlange von Windows zuzugreifen brauchst du natürlich Windows-spezifische Funktionen: Win32API o.ä.
Die billige Lösung ist, mit CreateProcess() (http://msdn2.microsoft.com/en-us/library/ms682425.aspx) Notepad zu veranlassen, die Datei auszudrucken: notepad /p {dateiname}.
Daepilin
18.03.2007, 13:33
Ich hab das jetzt probiert, aber es geht nicht. wie bekomme ich folgendes in die Datei:
"\n Preis - 10%: "<<iZehn<<" \n" " Preis - 20%: "<<iZwanzig<<" \n" " Preis - 25%: "<<iFuenfundzwanzig<<" \n" " Preis - 30%: "<<iDreisig<<" \n" " Preis - 50%: "<<iFuenfzig<<" \n";
Thoronador
18.03.2007, 14:12
Ich hab das jetzt probiert, aber es geht nicht. wie bekomme ich folgendes in die Datei:
"\n Preis - 10%: "<<iZehn<<" \n" " Preis - 20%: "<<iZwanzig<<" \n" " Preis - 25%: "<<iFuenfundzwanzig<<" \n" " Preis - 30%: "<<iDreisig<<" \n" " Preis - 50%: "<<iFuenfzig<<" \n";
Nun, etwas fällt mir auf: da deine Variablenbezeichner mit i beginnen, vermute ich, dass es sich dabei um Integer handelt, richtig? Allerdings ist das eine schlechte Wahl, falls man von einem eingegebenen Preis irgendwelche Prozente berechnen will (und danach sieht es ja aus). Dort kommen fast mit Sicherheit gebrochene Zahlen heraus, sodass ein Fließkommatyp eher angebracht wäre als ein ganzzahliger Typ für diese Variablen.
Daepilin
18.03.2007, 15:24
Ich hab floats. Hatte nur keine Lust die Variablennamen zu ändern.( waren erst Integer)
Daepilin
19.03.2007, 16:45
Push
wurzel^2
19.03.2007, 17:13
mir fällt im mom nur eine lösung ein, da momentan wohl keinem etwas einfällt ;)
lad dir yabasic (www.yabasic.de) und installiers... damit geht des ziemlich einfach, wie, weiß ich auch grad net (is länger her dass ich damit was gemacht hab ;) ) les es in der docu nach.
programieren läßt sich mit yab eig auch ganz einfach, nix schweres wenn man c/c++ kann
mfg wurzel^2
Daepilin
19.03.2007, 17:39
Und was soll mir das bei meinem C++ Problem helfen? Ich wollte keine neue Sprache lernen. es muss doch möglich sein, das oben von mir gepostete mit C++ in eine Txt Datei zu kriegen.
Für den Dateizugriff gibts unter C++ die fstream-Klassen.
Hier ist ein kleines Beispiel, wie du "test" in eine test.txt Datei schreibst.
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char *argv)
{
ofstream ofs("test.txt");
ofs << "test" << endl;
return 0;
}
Wenn du ein Linux hast, dann geht das mit dem Drucken noch einfacher:
Du gibst einfach deine Ausgaben weiterhin mit cout auf die Standardausgabe aus, und rufst dein Programm folgendermaßen auf:
./mein_programm | pr | lpr
Damit druckst du die Ausgabe deines Programms seitenweise mit Seitenzahl und Datum aus.
wurzel^2
19.03.2007, 19:16
Und was soll mir das bei meinem C++ Problem helfen? Ich wollte keine neue Sprache lernen. es muss doch möglich sein, das oben von mir gepostete mit C++ in eine Txt Datei zu kriegen.
ja..in txt ist kein problem...ich dachte nur falls du es DRUCKEN willst: du könntest ja auch einfach mit yab ein kleine progg machen das dann die txt ausließt? ;)
oder eventuell gleich alles mit yab machen, wenn des dir eine zu "unsaubere" lösung ist Oo
Daepilin
19.03.2007, 19:19
Wie bekomme ich das denn in ne txt? So ne txt kann man ja über den Edito ausdrucken.
wurzel^2
19.03.2007, 19:32
schau mal was nax geschrieben hat (2 weiter oben)
http://www.volkard.de/vcppkold/dateien.html
ein tut von www.volkard.de... des sollte dir helfen
mfg wurzel^2
Daepilin
20.03.2007, 13:52
Für den Dateizugriff gibts unter C++ die fstream-Klassen.
Hier ist ein kleines Beispiel, wie du "test" in eine test.txt Datei schreibst.
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char *argv)
{
ofstream ofs("test.txt");
ofs << "test" << endl;
return 0;
}
Wenn du ein Linux hast, dann geht das mit dem Drucken noch einfacher:
Du gibst einfach deine Ausgaben weiterhin mit cout auf die Standardausgabe aus, und rufst dein Programm folgendermaßen auf:
./mein_programm | pr | lpr
Damit druckst du die Ausgabe deines Programms seitenweise mit Seitenzahl und Datum aus.
Dabei bekomme ich beim kompilieren folgenden Fehler.
\Programmieren\Prozentabzug.exe D:\Dev-Cpp\mingw32\bin\ld.exe: cannot open output file D Permission denied
Daepilin
22.03.2007, 14:15
Push, ich bekomme den Fehler immernoch
wurzel^2
22.03.2007, 14:40
hm... kannst du ander projekte fehlerfrei kompelieren, also ausschließen dass der kompiler ggf futsch ist?
Daepilin
22.03.2007, 14:43
jo, das geht. Hab ich gerade ausgetestet.
Auch, wenn ich keine Ahnung von C++ habe:
Hast du den Pfad mit doppelten Slashes (also D:\\Blablabla) geschrieben? Wenn nein, dann mach das mal.
Oder versuche, mit einem Texteditor eine leere Datei zu erzeugen, vielleicht kann das Ding ja keine neuen Dateien erzeugen - ich weiss es nicht :)
Daepilin
22.03.2007, 16:59
Letzterres mgeht, und der Pfad wird vom Programm erzeugt.( afair)
Naja, das klingt so als wäre irgendetwas mit deinen Projekteinstellungen falsch oder so.
Hast du schon mal probiert das Programm per Commandline zu compilieren? [ g++ ./test.cpp -o test_prg.exe (oder wie auch immer der MinGW-g++ auch heißen mag...)]
Achja, was mir gerade aufgefallen ist, natürlich muss es int main(int argc, char *argv[]) heißen, da hab ich mich wohl vertan oo"
Daepilin
23.03.2007, 12:19
Hab keine Projekteinstellungen, da ich solche 50 - 60 Zeilen Programme nur als Quelldatei ohne Projekt abspeicher. Allerdings bekomme ich immer noch den Fehler.
\Programmieren\Prozentabzug.exe | D:\Dev-Cpp\mingw32\bin\ld.exe: cannot open output file D | Permission denied
Hier ist mal der komplette Code:
//Prozente abziehen
#include <iostream>
#include <fstream>
using namespace std;
int rechnung()
{
cout<<" \nGeben sie bitte den Preis ein: ";
float iPreis;
cin >> iPreis;
cout<<" \nFalls vor der Prozentrechnung etwas vom Preis abgezogen werden soll, dann geben sie den Betrag jetzt ein( er wird spaeter wieder addiert ): ";
float iAbzug;
cin >> iAbzug;
cout<<" \nEs wird mit folgenden Prozenten gerechnet: 10%, 20%, 25%,30% und 50%.\n";
float iPA;
iPA = iPreis - iAbzug;
float iZehn;
iZehn = iPA - (iPA / 100 * 10) + iAbzug;
float iZwanzig;
iZwanzig = iPA - (iPA / 100 * 20) + iAbzug;
float iFuenfundzwanzig;
iFuenfundzwanzig = iPA - (iPA / 100 * 25) + iAbzug;
float iDreisig;
iDreisig = iPA - (iPA / 100 * 30) + iAbzug;
float iFuenfzig;
iFuenfzig = iPA - (iPA / 100 * 50) + iAbzug;
cout<<"\n Preis - 10%: "<<iZehn<<" \n";
cout<<" Preis - 20%: "<<iZwanzig<<" \n";
cout<<" Preis - 25%: "<<iFuenfundzwanzig<<" \n";
cout<<" Preis - 30%: "<<iDreisig<<" \n";
cout<<" Preis - 50%: "<<iFuenfzig<<" \n";
ofstream ofs("Prozentabzugergebnisse.txt");
ofs << "\n Preis - 10%: "<<iZehn<<" \n" " Preis - 20%: "<<iZwanzig<<" \n" " Preis - 25%: "<<iFuenfundzwanzig<<" \n" " Preis - 30%: "<<iDreisig<<" \n" " Preis - 50%: "<<iFuenfzig<<" \n" << endl;
system("PAUSE");
rechnung();
}
int main(int argc, char *argv[])
{
cout<<" \nWilkommen in diesem Programm zum abziehen von Prozenten eines Preises. \n";
rechnung();
}
Am Code liegts nich, kompiliert hier frei durch.
Einziges was er anmeckert ist das main keinen Rückgabewert besitzt obwohl man einen anpreist. Das selbe gilt für die Funktion darüber.
Eine Sache gibs da, die du aber wahrscheinlich eher nich falsch gemacht hast.
Das ausgeführte Programm darf nicht offen sein wärend du neu übersetzt. :D
Daepilin
23.03.2007, 13:07
Ne, so blöd bin ich nicht. Ich arbeite schon ne Zeit mit C++. Was bedeutet den die Fehlermeldung? Würde es helfen, das ganze auf ne andere Partition zu packen?
Thoronador
23.03.2007, 15:07
Die Meldung "cannot open output file blabla..." heißt, dass die entsprechende Datei nicht geöffnet bzw. nicht auf sie zugegriffen werden kann. Mögliche Gründe sind verschieden. Zum einen könnte es sein, dass man nicht über die nötigen Zugriffsrechte verfügt, zum anderen könnte die Datei bereits von einem anderen Programm/Prozess in Beschlag genommen sein.
Was mir an dem Code auffällt (abgesehen von den nicht vorhandenen Rückgabewerten der Funktionen) ist, dass die Funktion rechnung() erst in der main-Funktion aufgerufen wird und rechnung() sich als letztes wieder selbst aufruft. Demzufolge würde das Programm niemals beendet werden. ;)
Daepilin
23.03.2007, 15:32
1. Ich bin SysAdmin, hab also die nötigen rechte. Und das Programm kann nicht schon verwendet werden.
2. Das soll so sein, damit man das Programm nicht für jede Rechnung ne Starten muss, was lästig werden kann.
Edit: Ich habs mal auf C verschoben, und das Compile ging, aber direkt die nächste frage: Wie kann ich verhindern, das der inhalt der Datei jedesmal überschrieben wird? Ich hätte es gerne So, dass die Ergebnise einer neuen Rechnung noch zusätzlich in die Datei kommen.
So etwas kann man in 2 Sekunden durch Google herausfinden: http://www.cplusplus.com/reference/iostream/ofstream/ofstream.html
Daepilin
23.03.2007, 17:35
Nur, dass ich leider nicht verstehe, was ich am jetzigen code verändern muss.:rolleyes:
Thoronador
23.03.2007, 18:34
1. Ich bin SysAdmin, hab also die nötigen rechte. Und das Programm kann nicht schon verwendet werden.
Wenn du wirklich die nötigen Rechte hast und das Programm nicht schon verwendet wird, dann ist die Meldung "Permission denied" -auf deutsch "(Zugriffs-)Erlaubnis verweigert"- schon ein wenig seltsam.
2. Das soll so sein, damit man das Programm nicht für jede Rechnung ne Starten muss, was lästig werden kann.
Sowas habe ich mir schon gedacht. Allerdings gibt es nach obigem Code keine Möglichkeit, dass dein Programm regulär beendet wird. Nicht gerade nutzerfreundlich...
Außerdem könnten diese verschachtelten Aufrufe dazu führen, dass (nach hinreichend vielen Aufrufen) der Stack zugemüllt ist, da die Funktion rechnung() niemals beendet wird. Das ist meiner Meinung nach (sehr) schlechter Stil. Um das zu umgehen, sollte die Funktion rechnung() sich nicht immer wieder selbst aufrufen, sondern man sollte den Aufruf von rechnung() innerhalb der main-Funktion in eine Schleife packen und am Ende der Schleife fragen, ob der Nutzer noch eine weitere Rechnung durchführen will. Falls ja, geht es mit einem neuen Schleifendurchlauf (und folglich einem weiteren Aufruf von rechung()) weiter, andernfalls bricht die Schleife ab und die main-Funktion kommt zum Ende, was bei obigem Code niemals passiert.
Daepilin
23.03.2007, 18:42
Wie gesagt, jetzt geht es. Man beachte meine obere Frage, auf die ich eine Antwort möchte.
Thoronador
24.03.2007, 13:18
Wie gesagt, jetzt geht es. Man beachte meine obere Frage, auf die ich eine Antwort möchte.
Man beachte den obigen Post von Nax:
So etwas kann man in 2 Sekunden durch Google herausfinden: http://www.cplusplus.com/reference/iostream/ofstream/ofstream.html
Wer lesen kann, ist klar im Vorteil. ;) Wer zusätzlich auch noch der englischen Sprache mächtig ist, hat noch bessere Karten... Schau dir mal die Parameter an, da wird dir auffallen, dass es gleich als erstes in der Liste ein append-Flag gibt, mit dem die Position im Stream auf das Ende desselbigen gestellt wird, sodass bei jeder folgenen Ausgabe jene an das Ende angehangen wird. Den musst du einfach noch hinzufügen.
PS: Übrigens ist der wiederholte Aufruf von rechnung() ohne eine Abbruchmöglichkeit immer noch schlecht, falls das noch nicht geändert wurde...
Daepilin
24.03.2007, 13:33
Wo muss ich den Flag den hinsetzen? (Das mit dem return() beheb ich, wenn das fertig ist.
Steht dort doch erklärt.
explicit ofstream ( const char * filename, ios_base::openmode mode = ios_base::out );
Dementsprechend ofstream(dateiname, ios_base::flag)
Also dürfte
ofstream ofs("Prozentabzugergebnisse.txt", ios_base::app);
funktionieren.
[edit] Ha schneller :D
Thoronador
24.03.2007, 13:47
Wo muss ich den Flag den hinsetzen?
Nach dem Dateinamen kommt der Flag:
ofstream ofs("Prozentabzugergebnisse.txt", ios_base::app);
Das wäre die entsprechende Zeile mit Flag.
Das mit dem return() beheb ich, wenn das fertig ist.
Ich meine nicht nur das return, sondern auch, dass man dem Benutzer über eine Abfrage nach jeder Rechnung die Möglichkeit geben sollte, zu entscheiden, ob er noch eine Rechnung will oder das Programm beendet werden soll. Nach obigem Code läuft das Programm je theoretisch endlos lange weiter.
Daepilin
24.03.2007, 14:37
THX für die Hilfe.
PS: Das meinte ich doch mit rechnung().
Edit: So, beides gemacht. bitte closen.
Powered by vBulletin® Version 4.2.2 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.