Integer in Char[] Array umwandeln
-
#include <iostream> using namespace std; int main() { char ch[10]; int i = 1234; itoa(i, ch, 10); cout << ch[10] << endl; return 0; }
Habe es so versucht, ausgegeben wurden aber nur unleserliche Zeichen. Was ist falsch?
-
cout << ch[10] << endl;
ch[10] dereferenziert eine Speicherstelle außerhalb des Arrays ch.
Richtig ist natürlich
cout << ch << endl;
-
ZenJu schrieb:
cout << ch[10] << endl;
ch[10] dereferenziert eine Speicherstelle außerhalb des Arrays ch.
Richtig ist natürlich
cout << ch << endl;
Au.. Was fürn blöder Fehler.. Und das nach 3 Monaten C++... Danke
-
Nach 3 Monaten C++ solltest Du solche Konvertierungen aber nicht mehr im C-Stil machen, sondern mit stringstreams:
#include <sstream>
#include <string>
#include <iostream>using namespace std;
...
stringstream ss;
int i = 1234;
string out;ss << i;
ss >> out;cout << out;
-
skullyan schrieb:
itoa(i, ch, 10);
itoa ist eine non-standard Funktion. Benutze sprintf.
sprintf (ch, "%d", i);
-
Hmm, hört sich beides interessant an. Stringstreams kannte ich bisher nicht... Aber nun ein anderes Problem:
int random; srand (time(NULL)); random = rand() % 100000+1; char altname[] = "C:\\data.txt"; char neuname[7]; sprintf (neuname, "%d", random); rename(altname, random); cout << neuname << endl;
Ich wollte eine Datei speichern und sie anschließend durch eine Zufallszahl umbenennen. Das hat nicht geklappt.
error C2664: 'rename': Konvertierung des Parameters 2 von 'int' in 'const char *' nicht möglich 1> Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
Was empfiehlt Ihr mir hier?
-
rename(altname, neuname);
-
JustAnotherNoob schrieb:
rename(altname, neuname);
Kompiliert jetzt, aber die Datei heißt immer noch data.txt...
char altname[] = "C:\\data.txt";
Ists denn richtig, die Datei samt Pfad einzugeben? Anders kann ich es mir auch schwer vorstellen...
-
Hier noch mal der komplette Code:
int random; srand (time(NULL)); random = rand() % 100000+1; char altname[] = "C:\\Users\\***\\Desktop\\data.txt"; char neuname[7]; sprintf (neuname, "%d", random); rename(altname, neuname); cout << neuname << endl;
-
1. Nur noch die letzte Zeile in deinem Quellcode ist C++, so langsam gehört das ins C Forum
2.rename
erwartet als erster und zweiter Parameter einen Pfad. Ein Name alleine reicht nicht.
3. Falls ein Fehler auftriff, kann man das prüfen und auch eine Fehlerausgabe erzielen:int r = rename(...); if(0 != r) { perror("Error renaming"); }
http://www.cplusplus.com/reference/clibrary/cstdio/rename/
http://www.cplusplus.com/reference/clibrary/cstdio/perror/Grüssli
-
Dravere schrieb:
1. Nur noch die letzte Zeile in deinem Quellcode ist C++, so langsam gehört das ins C Forum
2.rename
erwartet als erster und zweiter Parameter einen Pfad. Ein Name alleine reicht nicht.
3. Falls ein Fehler auftriff, kann man das prüfen und auch eine Fehlerausgabe erzielen:int r = rename(...); if(0 != r) { perror("Error renaming"); }
http://www.cplusplus.com/reference/clibrary/cstdio/rename/
http://www.cplusplus.com/reference/clibrary/cstdio/perror/Grüssli
Okay und wie füge ich eine Variable zu einem string (bzw. char Array) hinzu, sodass es dann auch mit der Dateiendung usw. klappt?
Also ich dachte dabei an folgendes:
random müsse praktisch an dieser Stelle -->"C:\\Users\***\\Desktop\\
random
.txt" auftauchen, oder mache ich jetzt einen Denkfehler?
-
Am einfachsten erreichst du das, in dem du C++ programmierst :p
In der C++ Standardbibliothek gibt es einenstd::string
:
http://www.cplusplus.com/reference/string/string/Ich bin mal so frei und schreib deinen Code etwas um:
#include <string> #include <sstream> #include <iostream> #include <ctime> #include <cstdio> #include <cstdlib> int main() { std::srand(std::time(0)); int random = std::rand() % 100000 + 1; // (1) std::string folder = "C:\\Users\\***\\Desktop\\"; std::string oldname = folder + "data.txt"; std::ostringstream oss(folder); oss << random << ".txt"; std::string newname = oss.str(); int err = std::rename(oldname.c_str(), newname.c_str()); if(err) { std::perror("Rename error"); } else { std::cout << "Success! New path: " << newname << std::endl; } return 0; }
(1) Aufpassen: http://www.cplusplus.com/reference/clibrary/cstdlib/RAND_MAX/
Grüssli
-
Dravere schrieb:
Am einfachsten erreichst du das, in dem du C++ programmierst :p
In der C++ Standardbibliothek gibt es einenstd::string
:
http://www.cplusplus.com/reference/string/string/Ich bin mal so frei und schreib deinen Code etwas um:
#include <string> #include <sstream> #include <iostream> #include <ctime> #include <cstdio> #include <cstdlib> int main() { std::srand(std::time(0)); int random = std::rand() % 100000 + 1; // (1) std::string folder = "C:\\Users\\***\\Desktop\\"; std::string oldname = folder + "data.txt"; std::ostringstream oss(folder); oss << random << ".txt"; std::string newname = oss.str(); int err = std::rename(oldname.c_str(), newname.c_str()); if(err) { std::perror("Rename error"); } else { std::cout << "Success! New path: " << newname << std::endl; } return 0; }
(1) Aufpassen: http://www.cplusplus.com/reference/clibrary/cstdlib/RAND_MAX/
Grüssli
Ok, darf also nur bis 32767 gehen...
Hab's kompiliert, allerdings sagt er nun "No such file or directory". Wenn ich
newname
am Ende ausgeben lasse, ist das die Ausgabe:2222.txt\***\Desktop\
PS.: Du hälst nicht besonders viel von "using namespace std;", nicht wahr? Wieso??
-
skullyan schrieb:
Ok, darf also nur bis 32767 gehen...
Bzw. es ist einfach abhängig von RAND_MAX. Kann gut sein, dass der Wert auch grösser ist, es muss einfach nicht sein
Für mehr Kontrolle gibt es auch eine Bibliothek von Boost:
http://www.boost.org/doc/libs/1_39_0/libs/random/index.htmlskullyan schrieb:
Hab's kompiliert, allerdings sagt er nun "No such file or directory". Wenn ich
newname
am Ende ausgeben lasse, ist das die Ausgabe:2222.txt\***\Desktop\
Habs grad selber getestet, hab das gleiche Problem. Und es ist für mich völlig unverständlich. In der Beschreibung des Standards steht, dass der Puffer mit dem Wert initialisiert wird. Dem scheint aber irgendwie nicht der Fall zu sein oder ich verstehe etwas anderes darunter. Der aktuelle TDM g++ und MSVC 2008 machen es jedenfalls beide so, wie ich es für falsch halten würde. Keine Ahnung ...
Man kann es aber einfach umschreiben:
// ... std::ostringstream oss; oss << folder << random << ".txt"; std::string newname = oss.str(); // ...
skullyan schrieb:
PS.: Du hälst nicht besonders viel von "using namespace std;", nicht wahr? Wieso??
Weil es nicht der Sinn von Namensräumen ist, dass man sie ständig aushebelt. Das führt über kurz oder lang zu Fehlern. Man sollte ein
using namespace
nur mit äusserster Vorsicht einsetzen und wenn, dann so lokal wie möglich. Nie in einen Header damit und wenn möglich nie in den globalen Scope. Ich verzichte oft sogar ganz darauf, damit ich gleich weiss, woher die Funktion oder Klasse stammt. So viel mehr Aufwand ist es schliesslich nicht und in der Programmierung geht es nicht darum, dass man möglichst wenig schreibt.Erst recht schreibe ich keine
using namespace
in diesem Forum oder nur äusserst selten, damit die Anfänger dies nicht einfach übernehmen, ohne dass sie sich im klaren darüber sind, was dies bedeutet.Also noch kurz, was ich höchstens mal verwende:
// 1. Lokales using namespace, nie global im Header void foo() { using namespace xyz; // xyz:: nicht mehr nötig. } // xyz:: wieder nötig. // 2. Umbenennung, meistens lokal, manchmal auch global im *.cpp File, nie im Header. void foo() { namespace fs = boost::filesystem; // Statt boost::filesystem:: kann ich nun fs:: verwenden. } // Gilt hier nicht mehr. // 3. Nur eine using Anweisung, auch wieder meistens nur lokal. void Class::swap(Class& c) { using std::swap; // Es wird nur diese Funktion aus dem Namensraum geholt. swap(m_1, c.m_1); swap(m_2, c.m_2); } // Und hier ist sie wieder weg.
Grüssli
-
Erstmal danke für deine umfangreiche Antwort.
Ich habe den Code noch mal ausprobiert, jetzt klappt alles, aber der Effekt bleibt aus.
Er sagt:
"Rename error: No such file or directory"
PS.: Ich habe auf'm Desktop sehr wohl eine Datei namens "data.txt" angelegt...
#include <string> #include <sstream> #include <iostream> #include <ctime> #include <cstdio> #include <cstdlib> int main() { std::srand(std::time(0)); int random = std::rand() % 32767 + 1; std::string folder = "C:\\Users\\***\\Desktop\\"; std::string oldname = folder + "data.txt"; std::ostringstream oss; oss << folder << random << ".txt"; std::string newname = oss.str(); std::cout << newname << std::endl; std::cout << oldname << std::endl; int err = std::rename(oldname.c_str(), newname.c_str()); if(err) { std::perror("Rename error"); std::cin.get(); } else { std::cout << "Success! New path: " << newname << std::endl; std::cin.get(); } return 0; }
-
Es steht doch hoffentlich nicht wirklich *** in deinem Pfad?
-
Braunstein schrieb:
Es steht doch hoffentlich nicht wirklich *** in deinem Pfad?
Nein.
-
skullyan schrieb:
Braunstein schrieb:
Es steht doch hoffentlich nicht wirklich *** in deinem Pfad?
Nein.
Stimmt auch der restliche Pfad? Bist du ganz sicher? Überprüfe es lieber nochmals dreimal mit voller Konzentration.
Grüssli
-
Dravere schrieb:
skullyan schrieb:
Braunstein schrieb:
Es steht doch hoffentlich nicht wirklich *** in deinem Pfad?
Nein.
Stimmt auch der restliche Pfad? Bist du ganz sicher? Überprüfe es lieber nochmals dreimal mit voller Konzentration.
Grüssli
Tut er es denn nicht? Wenn ja, bitte ich um Korrigierung, denn ich finde wirklich keinen Fehler... Bis auf meinen Benutzernamen sollte es in Windows ja normal sein...
-
skullyan schrieb:
Tut er es denn nicht? Wenn ja, bitte ich um Korrigierung, denn ich finde wirklich keinen Fehler... Bis auf meinen Benutzernamen sollte es in Windows ja normal sein...
Es ist überall ein wenig anders. Ja nach Windows oder Sprache. Zudem gibt es auch mehrere Desktops, für jeden User halt und meistens noch ein allgemeiner.
Bei mir sähe der Pfad so aus:
C:\Dokumente und Einstellungen\***\Desktop\Wobei *** durch mein Name zu ersetzen wäre. Und bei mir funktioniert der Code, wenn alles richtig angegeben wurde
Grüssli