String mit leerzeichen auffüllen
-
hallo, ich habe eine struct person
struct Person { char vorname[30]; char nachname[30]; };
die ich in eine Datei schreiben möchte / von dort auslesen möchte.
dazu müssen die Elemente dieser struct ja alle eine fixlänge haben.
also hab ich mir so eine fillup-funktion geschrieben;char* auffuellen(char* text, int gesamtlaenge) { char* ret; strcpy(ret, text); for (int i = sizeof(text)+1; i<gesamtlaenge; i++) { ret[i] = ' '; } ret[gesamtlaenge] = '\0'; return ret; } void person_speichern(char* filename, Person* p) { char* c = auffuellen(p->vorname, 10); FILE* fp = fopen(filename, "w"); fprintf(fp, p->vorname); fprintf(fp, p->nachname); fclose(fp); } int main() { struct Person* p = person_einlesen(); person_speichern("personen.dat", p); char* b = "test"; char* c = auffuellen(p->vorname, 10); cout << c << "."; }
das komische is: sie funktioniert in der main, in der person_speichern bekomm ich allerdings einen fehler ...
weiß da noch irgendwer weiter?!
mfg, guni
-
Ich glaub es würde jedem helfen, wenn du sagen würdest wie der Fehler aussieht...
-
guni schrieb:
das komische is: sie funktioniert in der main, in der person_speichern bekomm ich allerdings einen fehler ...
Oho, einen Fehler, na dann ist ja alles klar...
Tipp:
Spar die die Frickelei! Nimm std::string und mach mittels std::string::append einen Einzeiler daraus.edit: Vermutlich entfällt bei Benutzung von std::string aber auch die Notwendigkeit, den String überhaupt mit Leerzeichen aufzufüllen.
-
SeppJ schrieb:
edit: Vermutlich entfällt bei Benutzung von std::string aber auch die Notwendigkeit, den String überhaupt mit Leerzeichen aufzufüllen.
Er will die feste Länge um einer Datei ein bestimmtes Format aufdrücken zu können.
-
HurgaHurga schrieb:
SeppJ schrieb:
edit: Vermutlich entfällt bei Benutzung von std::string aber auch die Notwendigkeit, den String überhaupt mit Leerzeichen aufzufüllen.
Er will die feste Länge um einer Datei ein bestimmtes Format aufdrücken zu können.
Na, dann ist es ja noch einfacher, egal ob mit char[] oder string:
#include <string> #include <iostream> using namespace std; int main () { string a="String"; char *b="char"; cout.width(10); cout.fill('_'); cout<<left<<a<<endl;; cout.width(10); cout<<left<<b<<endl;; return 0; }
-
guni schrieb:
void person_speichern(char* filename, struct Person* p)
{
char* c = auffuellen(p->vorname, 10);
FILE* fp = fopen(filename, "w");
fprintf(fp, p->vorname);
fprintf(fp, p->nachname);
fclose(fp);
}brauchst du natürlich nur in C...
-
FreakY<3Cpp schrieb:
Ich glaub es würde jedem helfen, wenn du sagen würdest wie der Fehler aussieht...
das weiß ich leider selbst nicht.
beim kompilieren bekomm ich noch keinen Fehler; erst bei ausführen des Programmes.
Ich verwende die Eclipse IDE; bekomme dann nur eine Messagebox, die besagt, dass das Programm geschlossen wird.SeppJ schrieb:
Tipp:
Spar die die Frickelei! Nimm std::string und mach mittels std::string::append einen Einzeiler daraus.danke. den befehl hab ich noch nicht gekannt.
mir ist es aber eigentlich darum gegangen, so eine funktion einfach mal selbst zu schreiben; aus übungszwecken.
und offensichtlich funktioniert sie auch; aber eben nur in der int main ...
-
guni schrieb:
das weiß ich leider selbst nicht.
beim kompilieren bekomm ich noch keinen Fehler; erst bei ausführen des Programmes.
Ich verwende die Eclipse IDE; bekomme dann nur eine Messagebox, die besagt, dass das Programm geschlossen wird.
...
und offensichtlich funktioniert sie auch; aber eben nur in der int main ...Dann poste eine lauffähige Version deines Programms, damit man den Fehler reproduzieren kann. Das verbessert deine Chance erheblich hier Hilfe zu bekommen.
-
#include <iostream> using namespace std; struct Person { char vorname[30]; char nachname[30]; }; Person* neue_person(char vorname[30], char nachname[30]) { Person* p = new Person; strcpy(p->vorname, vorname); strcpy(p->nachname, nachname); return p; } Person* person_einlesen() { char vorname[30]; char nachname[30]; cout << "Vorname: "; cin >> vorname; cout << "Nachname: "; cin >> nachname; Person* p = neue_person(vorname, nachname); return p; } void person_ausgeben(Person p) { cout << "person_ausgeben():\n"; cout << p.vorname << "\n"; cout << p.nachname << "\n"; } char* auffuellen(char* text, int gesamtlaenge) { char* ret; strcpy(ret, text); for (int i = sizeof(text)+1; i<gesamtlaenge; i++) { ret[i] = ' '; } ret[gesamtlaenge] = '\0'; return ret; } void person_speichern(char* filename, Person* p) { char* c = auffuellen(p->vorname, 10); FILE* fp = fopen(filename, "w"); fprintf(fp, p->vorname); fprintf(fp, p->nachname); fclose(fp); } int main() { struct Person* p = person_einlesen(); person_speichern("personen.dat", p); char* b = "test"; char* c = auffuellen(p->vorname, 10); cout << c << "."; }
-
das auffuellen (Zeile 51) soll in weiterer Folge natürlich in die darunter stehenden fprintf's eingebaut werden; aber es macht schon "ausserhalb" probleme
-
guni schrieb:
dazu müssen die Elemente dieser struct ja alle eine fixlänge haben.
Das glaube ich nicht. Zumindest brauchst Du kein Auffüllen dazu.
guni schrieb:
char* auffuellen(char* text, int gesamtlaenge) { char* ret; strcpy(ret, text); for (int i = sizeof(text)+1; i<gesamtlaenge; i++) { ret[i] = ' '; } ret[gesamtlaenge] = '\0'; return ret; }
das komische is: sie funktioniert in der main,
Ich glaube nicht, das es in main funktioniert:
Zuerst: wo ist der Speicher für ret? Da fehlt ein new oder malloc vor dem strcpy!
Zweitens: sizeof(text) macht sicher was ganz anderes als Du glaubst. Das gibt die Länge eines Zeigers in Byte an, nicht die Länge des Textes!
Drittens: Wieso füllst Du die Leerzeichen in eine Kopie? Wenn man sich "person_speichern" ansieht, denke ich, Du wolltest p->vorname mit Leerzeichen auffüllen und nicht eine Kopie haben, die Du dann wieder wegwirfst.DJohn
-
DJohn@work schrieb:
guni schrieb:
dazu müssen die Elemente dieser struct ja alle eine fixlänge haben.
Das glaube ich nicht. Zumindest brauchst Du kein Auffüllen dazu.
wie soll es dann funktionieren?
wenn ich die Datei später wieder einlese will ich ja wissen, wie groß die jeweiligen Attribute meiner Struct sind, damit ich dann immer mit fseek auf die richtige Position springen kann ...
oder gibt es da eine schönere Lösung?!
Wenn ich kein Auffüllen hernehm, dann hab ich das Problem, dass meine Strings zwar in die Datei geschrieben werden, aber nur mit der aktuellen und nicht mit der maximalen Länge ...DJohn@work schrieb:
guni schrieb:
das komische is: sie funktioniert in der main,
Ich glaube nicht, das es in main funktioniert:
Zuerst: wo ist der Speicher für ret? Da fehlt ein new oder malloc vor dem strcpy!ich hab es ausprobiert und es geht ...
ich programmier hauptsächlich in java und in perl; ich hab mir noch nie gedanken darüber gemacht, wo mein speicher ist
ok - wie hätte das ganze denn auszusehen in c?!DJohn@work schrieb:
Zweitens: sizeof(text) macht sicher was ganz anderes als Du glaubst. Das gibt die Länge eines Zeigers in Byte an, nicht die Länge des Textes!
oh. dann hatte ich mit sizeof("text") wohl nur glück *gg*
DJohn@work schrieb:
Drittens: Wieso füllst Du die Leerzeichen in eine Kopie? Wenn man sich "person_speichern" ansieht, denke ich, Du wolltest p->vorname mit Leerzeichen auffüllen und nicht eine Kopie haben, die Du dann wieder wegwirfst.
eigentlich sollte da stehen auffuellen(p->vorname, 30);
das hat mir nur einen Fehler gegeben und jetzt dachte ich, schreib meine Funktion mal so wie in der main weil ich davon ausgegangen bin, dass sie dann funktionieren müsste (nachdem sie mir in der main mit gleichem Aufruf auch zurückgegben hat was ich erwartet habe ...)
na ja - da hab ich mich jedenfalls getäuscht ...DJohn[/quote]