schreiben in ein file
-
code zuerst
#include <stdio.h> #include <conio.h> #include <string.h> int main() { FILE *datei; char dateiname[25]; char zeichen; char abbruch='#'; char part[5]="c:/"; printf("\nBitte Dateinamen eingeben: "); scanf("%s",&dateiname); datei=fopen((strcat(part,dateiname)),"w+"); if(datei==NULL) printf("Datei konnte nicht geöffnet werden!"); else { printf("\nDatei wurde angelegt: %s\nBereit zum Schreiben (Abbruch mit \"#\")",part); while((zeichen=getchar())!=abbruch) putc(zeichen,datei); fclose(datei); getch(); } }
also mein problem ist folgendes: wenn ich die erstellte datei öffen beginnt sie immer mit einer leerzeile.. warum? wie kann ich das ändern?
2.wenn ich "#" also die abbruchbedingung eingebe und bestätige muss ich erst erneut mit enter drücken damit das prog beendet wird, warum denn das?!
[falls ihr noch lust habt...]
3.:fehler bei der initialisierung von part(ition):
wenn ich nur 3 elemente angebe was ja reichen müsste (part[0]='c', part[1]=':', part[2]='/', part[3]='/0' bzw. part[3]=0) dann kommt, es seien zu wenig elemente.
wenn ich 4 angebe wird das abbruchszeichen mit in die datei geschrieben (?!?!?!) und die datei folglich nicht beendet. erst ab min. 5 elementen klappts...schonmal vielen dank
ode
-
Ode schrieb:
code zuerst
char part[5]="c:/"; datei=fopen((strcat(part,dateiname)),"w+");
Bitte nochmal strcat im Buch nachgucken. Siehe unten.
also mein problem ist folgendes: wenn ich die erstellte datei öffen beginnt sie immer mit einer leerzeile.. warum? wie kann ich das ändern?
Nach dem Enter bei der Dateinamenseingabe steht noch ein '\n' im Puffer.
2.wenn ich "#" also die abbruchbedingung eingebe und bestätige muss ich erst erneut mit enter drücken damit das prog beendet wird, warum denn das?!
Ich weiß nicht genau, was 'erneut enter drücken' bedeuten soll, aber ich schätze dich stört das getch() am Ende der Schleife für diesen Fall. Oder dich stört, daß normalerweise Tastatureingaben gepuffert gelesen werden, also man das '#' erst mal mit Enter 'abschicken' muß. Macht also zwei mal Enter.
[falls ihr noch lust habt...]
3.:fehler bei der initialisierung von part(ition):
wenn ich nur 3 elemente angebe was ja reichen müsste (part[0]='c', part[1]=':', part[2]='/', part[3]='/0' bzw. part[3]=0) dann kommt, es seien zu wenig elemente.Es heißt '\0' und außerdem sind 0,1,2,3 natürlich 4 Elemente. Ich denke aber, dein Problem ist das strcat von oben, das versucht, an ein 5-Zeichen-Array einen potentiell 25-Zeichen-Namen anzuhängen.
-
ok vielen dank @daniel die sache mit dem puffer hat geklappt und die 2te bestätigung kommt wie du gesagt hast vom "getch();" hätt ich selbst draufkommen können, habs aber vergessen wegzumachen weil zwischen dem schreiben und dem getch() eigentlich noch was anderes kommt. Bei dem problem mit den feldern dacht ich dasses wie in basic ist, also wenn man die zahl 3 bei der initialisierung angibt, man eigentlich 4 hat. zum letzten problem: gibts sone art onlinehilfe wie in basic? am besten noch für den dev-c/c++ compiler...
-
Bei Strings kommt bei scanf("%s",&dateiname); kein & hin.
-
feigling schrieb:
Bei Strings kommt bei scanf("%s",&dateiname); kein & hin.
und wenn?
ist' auch egal
-
dürfte eigentlich nicht sehr schwer sein aber ich komm leider net drauf... wie sieht die bedingung aus wenn ichs gerade andersrum machen will, also das file auslesen will?
ich dachte da an
while((zeichen=getc(datei))!=[???])
doch was kommt dann an der stelle "[???]"? mit 0 oder NULL oder was auch immer klappts nich. gibt es da vielleicht sowas ähnliches wie in basic (hier blitz 3d) also :
while not char$(i)="" readt=readbyte(file) char$(i)=chr$(readt) wend (schleife wird nach ende des z.b. txt-files beendet) bzw. so: while not readt=asc(chr$(13)) readt=readbyte(file) wend (beendet das lesen schon, wenn ein zeilenumbruch mit enter eingeleitet wird) genau sowas bräuchte ich!
-
ah ok die antwort hab ich mir ja selbst gegeben -.-
also mit typecasting gehts natürlich aber vielleicht gibts in C noch ne elegantere Variante
-
wenn ich den thread nochmal kurz zurück ins leben rufen darf...
wie kann ich das kompakter schreiben? es läuft nämlich alles nach demselben schema ab, also zuerst wird der name des strukturelemnets mit printf ausgegeben, danch mit scanf in das jeweilige strukturelement eingelesen. wie kann ich das alternativ lösen, ohne die printf/scanf funktionen immer im wechsel aufrufen zu müssen, also das automatisch ins nächste strukturelement geschrieben wird? man könnte es so ja noch verschmerzen aber das soll später wieder aus dem file ausgelesen werden und dann geht alles wieder von vorne los...for(i=0;i<anzahl;i++) { printf("\n\nKontakt %d\n\n",i+1); printf("Name:"); scanf("%s",kontakt[i].Name); printf("Vorname:"); scanf("%s",kontakt[i].Vorname); printf("Strassenname:"); scanf("%s",kontakt[i].Strassenname); printf("Hausnummer:"); scanf("%s",kontakt[i].Hausnummer); printf("PLZ:"); scanf("%s",kontakt[i].PLZ); printf("Ort:"); scanf("%s",kontakt[i].Ort); printf("Telephonnummer:"); scanf("%s",kontakt[i].Telefonnummer); }
falls das noch benötigt wird:
struct datensatz { char Name[50]; char Vorname[50]; char Strassenname[50]; char Hausnummer[50]; char PLZ[10]; char Ort[50]; char Telefonnummer[50]; }kontakt[5];
-
Wirklich kompakter wird es wohl nicht gehen, zumindest fällt mir nichts ein was kompakter und gleichzeitig gut lesbar wäre.
Außerdem solltest du dich möglichst bald davon verabschieden, Stringeingaben mit scanf() zu regeln. fgets() ist da wesentlich sicherer.