File Input/Output

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • File Input/Output

    Hallo,

    ch hab hier mal ne Frage:

    Die Aufgabenstellung lautet:
    1. Ein Unterprogramm um die Zeilen in einem File zu zählen und ans
    Hautptprogramm zurueck zugeben. Ausgabe im Hauptprogramm.
    Übergabeparameter: char filename[]
    Rückgabeparameter: int


    1. Ein Unterprogramm um die Zeilen im File durchzusuchen und alle Zeilen die
    mit einem # beginnen in ein neues File mit dem Namen "komment.txt"
    zu schreiben.
    Übergabeparameter: char filename[]
    Rückgabeparameter: ---

    Es hat auch geheißen das man den Namen der Files übergeben muss.

    Quellcode

    1. char filename[20]="2bhel10_test3.txt";
    2. // und
    3. char filename1[20]="komment.txt";


    Was bringt das wenn ich das so mache? Das heißt ja z.B das an der 0. Stelle eine 2 steht bei filename[20].
    Was hat das für nen Sinn? Was mach ich da genau, wenn ich sowas mache?

    MfG Mr Gibbs

    Programm:

    Quellcode

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #define MAXSTRLEN 40
    4. /* unterprogramm zum zaehlen der zeilen
    5. * in: der dateiname der angabedatei
    6. * out: die anzahl
    7. */
    8. int count(char filename[]);
    9. /* unterprogramm zum suchen der zeilen, die mich einem # beginnen
    10. * in: der dateiname der angabedatei
    11. * out: ---
    12. */
    13. void searchforhash(char filename[]);
    14. int count(char filename[])
    15. {
    16. int anzahl=0;
    17. char temp[MAXSTRLEN];
    18. FILE*fileio=NULL;
    19. fileio=fopen(filename,"r");
    20. if(fileio==NULL)
    21. {
    22. printf("fehler beim einlesen!");
    23. }
    24. while(!feof(fileio))
    25. {
    26. fscanf(fileio,"%s\n",&temp);
    27. fflush(stdin);
    28. anzahl++;
    29. }
    30. fclose(fileio);
    31. return(anzahl);
    32. }
    33. void searchforhash(char filename[])
    34. {
    35. char temp[MAXSTRLEN];
    36. char filename1[20]="komment.txt";
    37. FILE*fileio1=NULL;
    38. FILE*fileio2=NULL;
    39. fileio1=fopen(filename,"r");
    40. if(fileio1==NULL)
    41. {
    42. printf("fehler beim einlesen!");
    43. }
    44. fileio2=fopen(filename1,"w");
    45. if(fileio2==NULL)
    46. {
    47. printf("fehler beim einlesen!");
    48. }
    49. while(!feof(fileio1))
    50. {
    51. fscanf(fileio1,"%s\n",&temp);
    52. fflush(stdin);
    53. if(temp[0]=='#')
    54. {
    55. fprintf(fileio2,"%s\n",temp);
    56. }
    57. }
    58. fclose(fileio1);
    59. fclose(fileio2);
    60. return;
    61. }
    62. int main(void)
    63. {
    64. char filename[20]="2bhel10_test3.txt";
    65. int anzahl1=0;
    66. anzahl1=count(filename);
    67. printf("die anzahl ist: %d\n\n",anzahl1);
    68. searchforhash(filename);
    69. return(0);
    70. }
    Alles anzeigen
  • Mr Gibbs schrieb:


    Quellcode

    1. char filename[20]="2bhel10_test3.txt";
    2. // und
    3. char filename1[20]="komment.txt";

    Was bringt das wenn ich das so mache? Das heißt ja z.B das an der 0. Stelle eine 2 steht bei filename[20].
    Was hat das für nen Sinn? Was mach ich da genau, wenn ich sowas mache?


    Du willst also wissen was ein Array ist?

    Die definition char filename[20] bewirkt das du eine Liste von Variablen vom Typ char von der Länge 20 bekommst. Dabei wird vom Nullten Element gezählt. Dh. man muss über den Index 0 bis einschlisslich 19 (in diesem Fall) auf die Variablen zugreifen.

    Solche eine Definition hat den Vorteil das die Elemente im Speicher alle fortlaufend folgen und im bei dem Spezielen typen char die Definiton über eine Zeichenkette bzw. einen String erfolgen kann ("").

    Aufgrund dessen das die Variablen im Speicher nacheinander folgen werden diese für Dateinamen, -pfade bzw. als Text genutzt.

    Mfg Rushh0ur
  • Hab lange gegooglelt, aber nicht gefunden, warum es bei 0 anfängt, tut es einfach, aber:
    Überlegt doch mal:
    Jahr 1 startet bei 0, also 0-1, so wird das bei Memory doch dann ähnlich sein, Addresse 0-1 ist 1, 1-2 ist 2 etc, (vom Startpunkt des Arrays aus)
    das vermute ich jedenfalls, wenn jemand was stichfestes hat, berichtigt mich bitte, aber das erscheint mir nur logisch.
    mfg Pokertom
    Du bist Terrorist, warum? Siehe hier
  • Die 0 ist auch eine Zahl. :P
    Gehen wir jetzt mal in die Mathematik, wo es ja auch Variablen gibt, dann kann X doch auch 0 sein.
    Was noch ist, ist, dass es doch eigentlich sogar unlogisch wäre bei 1 anzufangen, denn dann bleibt die 0 ja leer. Hier am Computer ist das ja kaum anders wie in der Mathematik, den 0. Platz belegt z.B. jemand der disqualifiziert wurde, die Variable an 0. Stelle ist nicht 0. Würden wir bei 1 Anfangen bliebe Platz 0 ja leer! Das wäre doch unnötig. Deshalb denke ich, wird bei Arrays immer bei 0 angefangen. Denn 0 != 0 wenn nichts darin gespeichert ist!
    Die Verbindung mit der Mathematik ist oberflächlich denn 0 nicht gleich 9 was am PC schon durchaus sein kann! Da dort die Plätze des Arrays und nicht die Zahl 0 gemeint ist.

    MfG
    Check
  • Also erstmal glaub ich nicht, dass die Frage irgendwas damit zu tun hat, warum die Arrayindizierung bei 0 anfängt. Aber ich kann mich auch täuschen ;)

    Nichtsdestotrotz kann ich euch sagen, warum das so ist:

    Es liegt daran wie Arrays implementiert sind. In C ist ein Array ja erstmal nichts anderes als ein Zeiger auf die Speicherstelle an der das erste Element des Arrays beginnt. Wenn man weiß von welchem Typ das Array ist, kann man dann ganz einfach berechnen, an welcher Speicherstelle die einzelnen Elemente des Arrays stehen. Das erste Element steht direkt bei Startadresse. Das zweite bei Startadresse + 1 * Elementlänge, das Dritte bei Staradresse + 2 * Elementlänge etc. etc.
    Also Berechnet man die Adresse der Elemente mit: Startadresse + i * Elementlänge, mit i = 0,1,2,...
    Und GENAU so funktioniert der Indexoperator mit genau dem gleichen i wie oben, das bei 0 anfängt um eben auch die Startadresse zu erwischen.

    Das ist übrigens rein historisch bedingt, man könnte problemlos auch Arrays machen, die bei 1 beginnen. Und es gibt sogar Sprachen bei denen das so ist.