Forum: Compiler & IDEs Variable kopieren


von David (Gast)


Lesenswert?

Ich hab mal einen Frage,
ich wollte gerne die Variable i in char *name1 kopieren,
um Damit eine  Datei zu öffnen.

vielleicht kann jemand von ihnen helfen
nfg
1
 
2
 uint8_t i = 1;
3
 char *name1;  
4
 name1="1.txt";  //so gehts
5
6
Fopen(name1,F_READ)!=F_OK)

von Lukas K. (carrotindustries)


Lesenswert?

David schrieb:
> name1="1.txt";  //so gehts
Aber auch nur weil es die Initialisierung der Variable ist, sonst musst 
du strcpy bemühen.

Wenn sichergestellt ist, dass i <= 9, dann kannst du
1
char *name1="n.txt";
2
name1[0] = i+'0';
schreiben.
Wenn nicht, itoa und strcat.

String-Verarbeitung in C

von David (Gast)


Lesenswert?

Mit strcat kann mann ja nur an Strings anhängen.
ich wollte die zeichen aber vor dem .txt  einfügen.



so wird die Datei als N angelegt
1
uint8_t i = 5;
2
char *name1="n.txt";
3
name1[0] = i+'0';
4
5
Fopen(name1,F_READ)!=F_OK)

so wird die Datei als 8 Leerzeichen angelegt angelegt
1
uint8_t i = 5;
2
char *name2="        .txt";
3
4
sprintf( nam, "%02d%02d%02d%02d",hour,minute,day,month);  //
5
6
name2[0] = nam[0];
7
name2[1] = nam[1];
8
name2[2] = nam[2];
9
name2[3] = nam[3];
10
name2[4] = nam[4];
11
name2[5] = nam[5];
12
name2[6] = nam[6];
13
name2[7] = nam[7];
14
15
Fopen(name2,F_READ)!=F_OK)

von Walter (Gast)


Lesenswert?

David schrieb:
> Mit strcat kann mann ja nur an Strings anhängen.
> ich wollte die zeichen aber vor dem .txt  einfügen.

frau macht dann das ganz tricky:
".txt" an den Zahlenstring anhängen

von Helmut L. (helmi1)


Lesenswert?

char   Name1[20];      // Genug Platz resevieren

i = 5;

itoa(i,Name1,10);

// hier steht jetzt "1" in Name1

strcat(Name1,".txt");

// ab hier steht "1.txt" in Name1

von DirkB (Gast)


Lesenswert?

Lukas K. schrieb:
>> name1="1.txt";  //so gehts
> Aber auch nur weil es die Initialisierung der Variable ist, sonst musst
> du strcpy bemühen.

Das Funktioniert auch als Zuweisung, da name1 ein char* ist.

>
> Wenn sichergestellt ist, dass i <= 9, dann kannst duchar *name1="n.txt";
> name1[0] = i+'0';
> schreiben.

Das geht in diesem Fall nicht, da das "1.txt" ein Stringliteral ist.
Und die sind i.A. schreibgeschützt.


Wenn man den Text ändern möchte, braucht man ein Array.

Man kann das ganze aber auch mit sprintf machen.

von Walter (Gast)


Lesenswert?

David schrieb:
> sprintf( nam, "%02d%02d%02d%02d",hour,minute,day,month);  //

so nicht da sprintf eine 0 am Ende schreibt und damit .txt weg ist,
warum nicht gleich
sprintf( nam, "%02d%02d%02d%02d.txt",hour,minute,day,month);

von DirkB (Gast)


Lesenswert?

Da habe ich den Post von David glatt übersehen :-(
Walter schrieb:
> sprintf( nam, "%02d%02d%02d%02d.txt",hour,minute,day,month);

Es ist besser zuerst die Werte zu nehmen, die sich am langsamsten 
ändern.
Also Jahr , Monat, Tag, Stunde ...
Dann sind die Dateien auch nach den Dateinamen auf/absteigend sortiert.

von Helmut L. (helmi1)


Lesenswert?

DirkB schrieb:
> Also Jahr , Monat, Tag, Stunde ...
> Dann sind die Dateien auch nach den Dateinamen auf/absteigend sortiert.

Es gibt aber Konventionen in welcher Reihenfolge Tag/Monat/Jahr 
ausgegeben werden sollen.

von Rrolf Magnus (Gast)


Lesenswert?

DirkB schrieb:
> Lukas K. schrieb:
>>> name1="1.txt";  //so gehts
>> Aber auch nur weil es die Initialisierung der Variable ist, sonst musst
>> du strcpy bemühen.
>
> Das Funktioniert auch als Zuweisung, da name1 ein char* ist.

Es ist ja auch eine Zuweisung und keine Initialisierung.

Helmut Lenzen schrieb:
> DirkB schrieb:
>> Also Jahr , Monat, Tag, Stunde ...
>> Dann sind die Dateien auch nach den Dateinamen auf/absteigend sortiert.
>
> Es gibt aber Konventionen in welcher Reihenfolge Tag/Monat/Jahr
> ausgegeben werden sollen.

Ja, und bei Dateinamen verwendet man aus obigem Grund als Konvention oft 
die angegebene Reihenfolge.

von David (Gast)


Lesenswert?

So jetzt gehts,
aber wie kann ich jetz die ersten 8 zeichen von datname in name1 
kopieren
damit nacher wieder in name1 01302105.text
mfg

1
char *name1;
2
char *datname="        .txt";
3
sprintf( datname, "%02d%02d%02d%02d.txt",hour,minute,day,month);  //
4
5
in datname steht jetzt 01302105.text

von Nichtschläfer (Gast)


Lesenswert?

David schrieb:
> wie kann ich jetz die ersten 8 zeichen von datname in name1
> kopieren

Das geht mit strncpy(). Aber name1 ist ein Pointer ohne reservierten 
Speicher!!!

von Karl H. (kbuchegg)


Lesenswert?

David schrieb:
> So jetzt gehts,

Glaub ich nicht.
Dein Code ist voller Fehler.

Tu dir doch selber einen Gefallen und kauf dir ein C-Buch.

In der Zwischenzeit kannst du die absoluten C-String Grundlagen hier
String-Verarbeitung in C
erst mal nachlesen.

> char *name1;
> char *datname="        .txt";

datname zeigt auf einen String (ein sog. String-Literal). Und diese 
String ist UNVERÄNDERBAR!
Du hast kein Recht in weiterer Folge da etwas drüber zuschreiben. 
Eigentlich sollte der Compiler diese Initialisierung gar nicht 
akzeptieren, aber aus historischen Gründen hat man diese eigentlich 
falsche Operation zugelassen.


char name1[9];
char datname[12];

sprintf( name1, "%02d%02d%02d%02d", hour, minute, day, month );
strcpy( datname, name1 );
strcat( datname, ".txt" );

Merke: Bei Strings ist es immer einfacher, sich Einzelteile zu 
generieren, aus denen man dann die kompletten Teile zusammensetzt, 
anstatt im Nachhinein einen kompletten String in Einzelteile zu 
zerlegen. Zumindest dann, wenn man es nicht konstanten Längen der 
Einzelteile zu tun hat.

von Marco M. (marco_m)


Lesenswert?

Wie Karl Heinz schon geschrieben hat funktioniert es nicht, wenn man 
versucht den Wert eines String Literals zu ändern.

Man muß den Template-String als Array deklarieren und initialisieren:
1
char name[]="_.txt";
2
name[0]=n+'0';

'char name[]="_.txt";' bedeutet 'deklariere "name" als array von char 
mit genau der Länge die der Initialisierer hat (also 6 Zeichen inkl. 0 
byte) und kopiere den Initialisierer "_.txt" in den Array'. Ersatzcode:
1
char name[6];
2
strcpy(name,"_.txt");
3
name[0]=n+'0';

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.