Fehler Durchsuchen einer Datei, Funktioniert jedes 2. Mal(Anfänger)

  • C++

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

  • Fehler Durchsuchen einer Datei, Funktioniert jedes 2. Mal(Anfänger)

    Hallo alle zusammen.
    Ich bastel im Moment an einer Datenbank. Sie ist möglichst simpel aufgebaut, da meine Kenntnisse in C++ sehr eingeschränkt sind und ich neu auf diesem Gebiet bin. Der Code funktioniert einigermaßen (schlecht^^). Jedoch gibt er mir beim Anfragen immer nur jedes zweite Mal eine korrekte Antwort. Dies müsste doch eigentlich nicht möglich sein, da ich das Abfragen als Funktion ausgelagert habe und er jedes Mal die Datei neu öffnet? Was habe ich falsch gemacht?

    Würde mich über jede Hilfe freuen

    lg CoolerFreak

    Achso:
    Dateiaufbau ist folgender:
    Anzahl der Datenpaare
    "Test" "TestInfo" "Test1" "Test1Info"...

    main.cpp:

    C-Quellcode

    1. #include <iostream>
    2. #include <fstream>
    3. #include <string>
    4. #include "funktionen.h"
    5. using namespace std;
    6. int main()
    7. {
    8. cout << "Database 1.0" << endl << "By ***" << endl;
    9. anzeigen();
    10. while(1)
    11. {
    12. suche();
    13. }
    14. }
    Alles anzeigen


    funktionen.h:

    C-Quellcode

    1. #include <iostream>
    2. #include <fstream>
    3. #include <string>
    4. using namespace std;
    5. int anzeigen(void)
    6. {
    7. ifstream dat_ein;
    8. ofstream dat_aus;
    9. int anzahl;
    10. char zeichen;
    11. string dateiname = "data.txt";
    12. int loop;
    13. string suche;
    14. dat_ein.open(dateiname.c_str(), ios_base::in); //offnen der Datei
    15. if(!dat_ein)
    16. {
    17. cout << "Datenbank konnte nicht geoeffnet werden" << endl;
    18. return -1;
    19. }
    20. dat_ein >> anzahl; //Anzahl der Datenpaare einer Datei einlesen
    21. string name[anzahl]; //Arrays zu jedem Paar erstellen
    22. string beschr[anzahl];
    23. suche = "Test";
    24. loop = 0;
    25. suche = "Test";
    26. while(loop < anzahl) //Solange Solange noch Datenpaare noch nicht eingelesen wurden
    27. {
    28. while(zeichen != '\"')
    29. {
    30. dat_ein.get(zeichen); //Bis zum ersten Datenwert einlesen
    31. }
    32. dat_ein.get(zeichen); //Das " uberspringen
    33. while(zeichen != '\"') // Bis zum nächsten " Einlesen
    34. {
    35. name[loop] += zeichen; // in den zugehörigen Array einspeichern
    36. dat_ein.get(zeichen);
    37. }
    38. dat_ein.get(zeichen); //Das " uberspringen
    39. while(zeichen != '\"') //Bis zum nächsten " einlesen
    40. {
    41. dat_ein.get(zeichen);
    42. }
    43. dat_ein.get(zeichen); // Das " uberspringen
    44. while(zeichen != '\"')
    45. {
    46. beschr[loop] += zeichen; // in den zugehörigen Array einspeichern
    47. dat_ein.get(zeichen);
    48. }
    49. dat_ein.get(zeichen);
    50. cout << name[loop] << ";" << beschr[loop] << endl; //Die eingelesen Werte ausgeben
    51. ++loop;
    52. }
    53. dat_ein.close();
    54. return 0;
    55. }
    56. int suche (void)
    57. {
    58. ifstream dat_ein;
    59. ofstream dat_aus;
    60. int anzahl;
    61. char zeichen;
    62. string dateiname = "data.txt";
    63. int loop;
    64. string suche;
    65. dat_ein.open(dateiname.c_str(), ios_base::in); //offnen der Datei
    66. if(!dat_ein)
    67. {
    68. cout << "Datenbank konnte nicht geoeffnet werden" << endl;
    69. return -1;
    70. }
    71. dat_ein >> anzahl;
    72. string name[anzahl];
    73. string beschr[anzahl];
    74. suche = "Test";
    75. loop = 0;
    76. suche = "Test";
    77. while(loop < anzahl)
    78. {
    79. while(zeichen != '\"')
    80. {
    81. dat_ein.get(zeichen);
    82. }
    83. dat_ein.get(zeichen);
    84. while(zeichen != '\"')
    85. {
    86. name[loop] += zeichen;
    87. dat_ein.get(zeichen);
    88. }
    89. dat_ein.get(zeichen);
    90. while(zeichen != '\"')
    91. {
    92. dat_ein.get(zeichen);
    93. }
    94. dat_ein.get(zeichen);
    95. while(zeichen != '\"')
    96. {
    97. beschr[loop] += zeichen;
    98. dat_ein.get(zeichen);
    99. }
    100. dat_ein.get(zeichen);
    101. ++loop;
    102. }
    103. dat_ein.close();
    104. cout << "Zu suchendes Objekt eingeben: "; //Suchbegriff einlesen
    105. cin >> suche;
    106. loop = 0;
    107. while(loop < anzahl) //Alle Datenpaare uberprufen
    108. {
    109. if(name[loop] == suche) //Vergleichen
    110. {
    111. cout << endl << beschr[loop] << endl; //richtigen Wert ausgeben
    112. break;
    113. }
    114. ++loop;
    115. }
    116. return 0;
    117. }
    Alles anzeigen
  • Also ohne jetzt gross den Code zu analysieren
    1) anzeigen () liefert eine Wert zurück, den Du aber in main.cpp nicht abfragst... --> Programm läuft auch bei Fehler weiter...
    2) while (1) --> Endlosschleife --> Wenn es Dir gefällt...
    3) Auch suche () liefert einen Wert der nicht abgefragt wird...
    4) Welcher Compiler ? Hat der eine Debug-Funktion ? Wenn nicht, mach einfach mal mehrere cout auf die Inhalte z.B anzahl usw...
  • Danke erst einmal für den Tipp.
    Ich benutze MinGWStudios, der verfügt über eine Debug-Funktion. Ich werde das gleich einmal überprüfen. Obwohl ich nichts am suchen oder anzeigen-Code verändert habe läuft das Programm jetzt. Ich habe einfach in main()

    Quellcode

    1. while(1)
    2. {
    3. cout << "Alle anzeigen\t\t<1>" << endl << "Durchsuchen\t\t<2>" << endl << "Neuer Datensatz\t\t<3>" << endl << "Benutzername aendern\t<4>" << endl <<
    4. "Hilfe\t\t\t<5>"<<endl;
    5. cin >> eingabe;
    6. switch(eingabe)
    7. {
    8. case 1:
    9. anzeigen();
    10. break;
    11. case 2:
    12. suche();
    13. break;
    14. case 3:
    15. neu();
    16. break;
    17. case 4:
    18. regini();
    19. break;
    20. case 5:
    21. readme();
    22. break;
    23. }
    24. }
    Alles anzeigen

    stehen. Trotzdem verstehe ich das nicht. Achso habe noch ein paar andere Funktionen eingebaut.
    Ich suche weiter nach dem Fehler.
    Danke für die HIlfe

    CoolerFreak