in Dokumente schreiben

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: in Dokumente schreiben

Beitrag von +Fuss+ » Do Feb 12, 2009 7:42 pm

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

int pin;
char *d, *n;
int main ()
{
  File *file;
  printf ("Willkommen in deinem Tagebuch. Um sicherzustellen das Keiner deine einträge Liest gebe bitte dein Pin ein.\nPin:");
  scanf ("%d", &pin);
  if (pin == 1234)
  {
  printf ("Der Pin ist in ordnung.\nWelchen Tagebucheintrag wollen sie Bearbeiten?");
  scanf ("%s", n);
  file = fopen("text"+n+".txt", "r+"); 
  }


  else
  {

  printf ("Der Pin wer Falsch. Sie haben keine Zugriffsrecht!");
  }
  return 0;
}
+n+ ist jetzt ein char. ich bin mir allerdings nicht sicher ob es von der Syntax her möglich ist, sonst musst du es mit strcat machen, sie dazu bitte im Wiki nach.

Ich habe den Code auch nur kurz überflogen und geringfügig geändert. Ich weiß nicht ob er so funktioniert.

MfG Fuss
Außerdem stimme ich cloidnerux im oben genannten voll zu.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: in Dokumente schreiben

Beitrag von nufan » Do Feb 12, 2009 8:08 pm

OK, ich gebe dir jetzt ein möglichst einfaches Beispiel zur Verwendung eines Files. Bitte sieh dir den Code genau an, versuch ihn zu verstehen. Ändere ihn ab und schau was passiert, bis du verstehst was in jeder einzelnen Zeile passiert.

Code: Alles auswählen

#include <stdio.h>
#include <string.h>     // Header für strcat, strcpy

void empty_buffer ();       // Prototyp für die Funktion (Unterprogramm) "empty_buffer"

int main ()
{

  FILE *filepointer;                // ein Pointer damit du auf die Daten im File zugreifen kannst
  char pfadzurdatei[50], text[100], nr[3];         
  // pfadzurdatei: selbsterklärend... (Achtung: Die Anzahl der Zeichen des Pfades dürfen 50 nicht übersteigen)
  // text: du hast 100 (genauer genommen 99) Zeichen die du eingeben und in die Datei schreiben kannst. Jedoch darfst du nicht Enter drücken.
  // nr: eine ZWEIstellige Nummer für die Datei (z.B. datei56.txt)

  strcpy (pfadzurdatei, "/home/dani93/Desktop/datei");          
  // der Ort der Datei und der Anfang des Dateinames werden in den String kopiert (den Pfad musst du für dich anpassen! Also z.B. C:\\Users\\Empire\\Desktop\\datei)
  
  printf ("Nummer der Datei: ");
  
  fgets (nr, 3, stdin); 
  // Eingabe der Dateinummer  

  strcat (pfadzurdatei, nr);
  // Die Dateinummer wird an den Pfad drangehängt
  
  strcat (pfadzurdatei, ".txt");
  // die Dateiendung ".txt" wird an den Pfad angehängt
  
  
  if ((filepointer = fopen (pfadzurdatei, "w")) != NULL)     // die Datei wird angelegt. Mit "filepointer" kann jetzt auf die Daten im File zugegriffen werden
  {

  // im if wird geprüft, ob "filepointer" ein gültiger Zeiger ist
  
    empty_buffer ();     // leert den Eingabepuffer, siehe Link unten
  
    printf ("Du kannst jetzt 99 Zeichen eingeben, die dann in die Datei geschrieben werden:\n");
    fgets (text, 100, stdin);      // Eingabe des Textes
    
    fputs (text, filepointer);     // String wird in die Datei geschrieben
    
    fclose (filepointer);           // Datei schließen
  
  }
  
    else                // Fehlermeldung ausgeben, wenn Datei nicht angelegt werden konnte
      printf ("Konnte Datei nicht anlegen.\n");

  empty_buffer ();   // Puffer leeren

  getchar ();      // Auf Eingabe warten

  return 0;

}



void empty_buffer ()
{

  int c;
  
  while ((c = getchar()) != EOF && c != '\n');

}
Warum den Eingabepuffer leeren?
http://tutorial.proggen.org/doku.php?id ... put-puffer


Sieh es dir genau durch, lies die Kommentare. Wenn es Fragen gibt, konkrete Fragen stellen. Wie du auch Enter miteinbeziehen kannst, sag ich dir wenn du ganz genau verstanden hast wie dieses Programm funktioniert.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: in Dokumente schreiben

Beitrag von Kerli » Fr Feb 13, 2009 4:22 am

cloidnerux hat geschrieben:Das ist scheiße, da du dadurch nicht erweiterungsfähig bist...
Bitte versuch doch deine Ausdrucksweise auf einem gewissen Niveau zu halten. Wenn du mit jemandem redest dann kann man schon so sprechen. Aber hier in diesem Forum wollen wir doch auch mit einer gewissen Seriosität auftreten.
cloidnerux hat geschrieben:Stattdessen wandelst du den Eingegeben Integer in einen String(Aneinadereiung von Chars) um und gibts den im dateinamen an, also ungefähr so:

Code: Alles auswählen

File *file=fopen("text"+atoi(nummer)+".txt", "r+");
@cloidnerux: Bevor du so einen falschen Code postest überleg dir bitte einmal in welcher Sprache wir sind oder versuch ihn zumindest zu kompilieren.

Da wir in C sind gibt es noch keine Möglichkeit den '+'-Operator zu überladen, weshalb dieser Code sicher nie möglich sein wird. Korrekterweise muss man Strings in C wie auch dani93 schon gesagt hat mit strcat aneinanderhängen.
dani93 hat geschrieben:

Code: Alles auswählen

char pfadzurdatei[50], text[100], nr[3];         
  // pfadzurdatei: selbsterklärend... (Achtung: Die Anzahl der Zeichen des Pfades dürfen 50 nicht übersteigen)
[...]
  fgets (nr, 3, stdin);
  // Eingabe der Dateinummer 

  strcat (pfadzurdatei, nr);
  // Die Dateinummer wird an den Pfad drangehängt
 
  strcat (pfadzurdatei, ".txt");
  // die Dateiendung ".txt" wird an den Pfad angehängt
Stimmt nicht ganz. Hier muss man aufpassen weil strcat den vorhandenen Speicherplatz nicht vergrößert. Deshalb darf der Pfad aus maximal 43 Zeichen bestehen: 43 + 2 (nr) + 4 (.txt) + 1 (\0 = binäre Null)
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: in Dokumente schreiben

Beitrag von Empire » Mo Feb 16, 2009 3:22 pm

Sorry das ich so lang net reagiert habe aber ich wars wochenende über krank.

@Fuss

Code: Alles auswählen

scanf ("%s", n);
weiter oben hast du u.a. diese zeile gepostet.
Hab ich was im tutoriel übersehen (weil ausnahmen bekanntlich die Regel bestähtigen ) oder müsste das :

Code: Alles auswählen

scanf ("%s", &n);
heisen?

mfg
Empire

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: in Dokumente schreiben

Beitrag von nufan » Mo Feb 16, 2009 3:31 pm

Empire hat geschrieben: @Fuss

Code: Alles auswählen

scanf ("%s", n);
weiter oben hast du u.a. diese zeile gepostet.
Hab ich was im tutoriel übersehen (weil ausnahmen bekanntlich die Regel bestähtigen ) oder müsste das :

Code: Alles auswählen

scanf ("%s", &n);
heisen?
Ich antworte mal für +Fuss+ :)
"n" ist vom Typ char *. D.h. "n" ist ein Zeiger. scanf verlangt als Argument eine Adresse, in die der eingegebene Wert gespeichert wird. Der Wert eines Pointers ist eine Adresse, also passt der Syntax.

Jedoch...

Code: Alles auswählen

char *d, *n;
int main ()
{
  File *file;
  printf ("Willkommen in deinem Tagebuch. Um sicherzustellen das Keiner deine einträge Liest gebe bitte dein Pin ein.\nPin:");
  scanf ("%d", &pin);
  if (pin == 1234)
  {
  printf ("Der Pin ist in ordnung.\nWelchen Tagebucheintrag wollen sie Bearbeiten?");
  scanf ("%s", n);
  file = fopen("text"+n+".txt", "r+");
  }

[...]

}
1. Warum sind d und n globale Variablen? Das hat hier überhaupt keinen Sinn, da es nicht einmal Unterprogramme gibt...
2. "n" bekommt keinen Wert (Adresse) zugewiesen. Also schreibt scanf den String in irgendeine zufällige Adresse. Entweder Anzahl der Zeichen einlesen, Speicher allokieren und dann String einlesen, oder einfach einen Array (z.B. n[100]) verwenden. scanf ist sowieso ungeeignet für Eingaben (speziell die von Strings). Besser eignet sich die Funktion "fgets", da hier die Anzahl der einzugebenden Zeichen festgelegt wird.

Am besten siehst du dir mal meinen Code an. Du musst jedoch aufpassen, dass du nicht zu viele Zeichen eingibst. Mach die Arrays besser zu groß als zu klein.

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: in Dokumente schreiben

Beitrag von Empire » Mo Feb 16, 2009 4:00 pm

Also wenn ich das :

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

int pin;
char *d, *n;
int main ()
{
  FILE *file;
  printf ("Willkommen in deinem Tagebuch. Um sicherzustellen das Keiner deine einträge Liest gebe bitte dein Pin ein.\nPin:");
  scanf ("%d", &pin);
  if (pin == 1234)
  {
  printf ("Der Pin ist in ordnung.\nWelchen Tagebucheintrag wollen sie Bearbeiten?");
  scanf ("%s", n);
  file = fopen("text"+n+".txt", "r+");
  }
teste kommt:

Code: Alles auswählen

e\Documents\Bibliotek\Untitled1.c||In function `main':|
e\Documents\Bibliotek\Untitled1.c|17|error: invalid operands to binary +|
e\Documents\Bibliotek\Untitled1.c|18|error: syntax error at end of input|
||=== Build finished: 2 errors, 0 warnings ===|
Mein gedanke "Dann mach mer das + halt weg" aber damit ist der Kompiler natürlich auch nicht zu frieden und motzt:

Code: Alles auswählen

e\Documents\Bibliotek\Untitled1.c||In function `main':|
e\Documents\Bibliotek\Untitled1.c|17|error: syntax error before "n"|
||=== Build finished: 1 errors, 0 warnings ===|
aber da wäre ein ; doch föllig fehl am Platz.
Was muss ich machen?
(da ihr gesagthabt ich soll selber probieren hab ich das auch und zwar mit:/ * - , : ; ! " § $ % & / ( ) = == . Mehr ist mir net eingefallen)

mfg
Empire

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: in Dokumente schreiben

Beitrag von nufan » Mo Feb 16, 2009 4:06 pm

Empire hat geschrieben:Also wenn ich das :

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

int pin;
char *d, *n;
int main ()
{
  FILE *file;
  printf ("Willkommen in deinem Tagebuch. Um sicherzustellen das Keiner deine einträge Liest gebe bitte dein Pin ein.\nPin:");
  scanf ("%d", &pin);
  if (pin == 1234)
  {
  printf ("Der Pin ist in ordnung.\nWelchen Tagebucheintrag wollen sie Bearbeiten?");
  scanf ("%s", n);
  file = fopen("text"+n+".txt", "r+");
  }
teste kommt:

Code: Alles auswählen

e\Documents\Bibliotek\Untitled1.c||In function `main':|
e\Documents\Bibliotek\Untitled1.c|17|error: invalid operands to binary +|
e\Documents\Bibliotek\Untitled1.c|18|error: syntax error at end of input|
||=== Build finished: 2 errors, 0 warnings ===|
1. Error: Soweit ich weiß, dient das '+' hier als überladener Operator. Was das genau bedeutet kann ich dir auch nicht sagen, nur, dass das in C soweit ich weiß nicht geht. Siehe auch Kerli's letzten Post.
2. Error: Es fehlt eine geschwungene Klammer die den main-Block beendet.
Empire hat geschrieben:Was muss ich machen?
Wie du in meinem Programm siehst und wie Kerli bereits anmerkte wird in C üblicherweise "strcat" zum Verketten von Strings verwendet.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: in Dokumente schreiben

Beitrag von fat-lobyte » Mo Feb 16, 2009 6:06 pm

Empire hat geschrieben:

Code: Alles auswählen

  file = fopen("text"+n+".txt", "r+");
Nein!
Das ist Java! Oder Javascript! Oder PHP oder keine ahnung... ABER NICHT C !
In C kann man nicht einfach zwei Strings addieren und es wird zusammengehängt!
Wieso nicht? Das wüsstest du, wenn du dich damit beschäftigt hättest. In C sind Strings arrays von Zeichen.
"text" und ".txt" sind somit arrays von zeichen. Die haben beide fixe Addresen, genauso wie hier das n eine addresse beinhaltet.
Denk mal nach, und beantworte meine Frage: macht es Sinn Speicheraddressen zu addieren? Kommt da das raus was du erwartest? (Ein zusammengehängter String)
Empire hat geschrieben:Was muss ich machen?
Dir das Kapitel über Arrays, Zeigern und Strings nochmal durchlesen.
dani93 hat geschrieben: 1. Error: Soweit ich weiß, dient das '+' hier als überladener Operator.
Was das genau bedeutet kann ich dir auch nicht sagen, nur, dass das in C soweit ich weiß nicht geht. Siehe auch Kerli's letzten Post.
Nein, ist es eben NICHT. Operatorüberladung gibts nur in C++, nicht in C.
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
+Fuss+
Beiträge: 385
Registriert: Fr Nov 14, 2008 8:16 pm

Re: in Dokumente schreiben

Beitrag von +Fuss+ » Mo Feb 16, 2009 6:10 pm

Da bei der Sache mit dem Plus war ich mir auch gar nicht sicher, hat alles auf das von cloidnerux "aufgebaut".
ich bin mir allerdings nicht sicher ob es von der Syntax her möglich ist, sonst musst du es mit strcat machen, sie dazu bitte im Wiki nach.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: in Dokumente schreiben

Beitrag von fat-lobyte » Mo Feb 16, 2009 6:25 pm

+Fuss+ hat geschrieben:Da bei der Sache mit dem Plus war ich mir auch gar nicht sicher, hat alles auf das von cloidnerux "aufgebaut".
Das kommt davon dass Leute die nicht so viel Ahnung haben Dinge schreiben von denen sie glauben dass sie richtig sind und andere meinen "es wird schon stimmen".
*grummel*

@Empire:

Wenn du die Kapitel gelesen hast, die ich dir empfohlen habe, dann sieh dir die funktionen strcat() und sprintf() an, mit denen wirst du das erreichen was du vorhattest (aber nur wenn du genau weißt was ein String ist.)
Haters gonna hate, potatoes gonna potate.

Antworten