Problem mit Lesefunktion, keine Ausgabe :(

Nord-Süd-Richtung

Erfahrenes Mitglied
Guten Abend Com!,
ich schreibe ein kleines Consolenspiel, und lese dazu aus Textdateien (bzw *.bin). Um nicht immer alles 3mal zu schreiben, habe ich es in eine Funktion gepackt.
Doch irgendwie ist keine Ausgabe zu sehen...
Die betreffenden Codezeilen:
C++:
void load_txt(string name);      
int main()
{
//[...]
char confirm[2];
cin>>confirm;
if (confirm == "o" || confirm == "O")
{
     load_txt("francais/description.bin");
}
cout<<confirm;
return 1;
}
void load_txt(string name)
{
     FILE *fp;
     char string[500];
     fp = fopen(string,"r");
     fscanf(fp,"%s",&string);
     while (fgets(string,500, fp) != 0)
     {
           printf("%s",string);
     }
     cout<<"TUT";
}
Es wird weder die betreffende Datei ausgelesen (ob sie existiert oder nicht, es erfolgt auch keine Fehlermeldung) noch TUT.
Please help :)
 
Sollte noch nichtmal kompilieren ... Sind Syntaxfehler drin.

=>
(1) Lass using namespace std; weg!
(2) Nicht C und C++-Funktionen mischen!
(3) return 0 ist erfolgreich, return != 0 => Fehler!
(4) Guck dir Referenzen an.
(5) Guck dir const an.
(6) Stringvergleich wird nicht per == relasiert! (da vergleichst du nur Zeiger ...). Entweder komplett std::string nutzen oder std::strcmp (Header: <cstring>)

C++:
#include <string> // std::string
#include <cctype> // std::tolower
#include <iostream> // std::cin, std::clog
#include <fstream> // std::ifstream
#include <stdexcept> // std::invalid_argument
#include <algorithm> // std::copy
#include <iterator> // std::istream_iterator, std::ostream_iterator

void load_txt(std::string const&);      
 
int main()
{
    // ...
    char confirm;
    std::cin >> confirm;
    std::tolower(confirm);

    if (confirm == 'o')
        load_txt("francais/description.bin");
  
    std::cin.get();
    return 0;
}

void load_txt(std::string const& filename)
{
    std::ifstream file_stream(filename.c_str());
    if (!file_stream) throw std::invalid_argument("invalid filename");
   
    std::copy(std::istream_iterator<char>(file_stream), std::istream_iterator<char>(), std::ostream_iterator(std::cout, ""));
}
... so ist es doch gut :)
 
Hi,

sorgt using namepsace std nciht dafür, das man das std:: weglassen kann?
Und leider hat es mir auch nicht weitergeholfen :(
Das Programm kompiliere ich einwandfrei mit Dev-C++
 
Nun gut. Nehmen wir mal Stellung zu euren Aussagen:
(1) Lass using namespace std; weg!:
Mach es wie du willst ...
Sicher? Wir sind in einem freien Land. Sinnvoll ist es dennoch nicht. Vllt. sinniert ihr einfach mal darüber nach, wofür es Namensräume gibt. Was passiert wenn man using namespace global setzt usw.

Ein Problem sollte in deinem Code bereits hier auftreten:
C++:
char string[500]; // okay, das kann klar gehen, weil vorher der Typ steht (string kann aber auch std::string meinen ...)
fp = fopen(string,"r"); // soll er hier eine std::string-Instanz anlegen oder einfach nur die Variable string nehmen?


Warum dein Programm nicht funktioniert hat? Na das ist einfach! Du gibst an fopen einen char-Array, der weder Nullterminiert ist, noch mit Gewissheit irgendwas enthält. Sein Inhalt ist schlicht undefiniert.

C++:
std::tolower(confirm);
if (confirm == 'o')
    // ...
Richtig ist es so:
C++:
confirm = std::tolower(confirm);
if (confirm == 'o')
    // ...
Okay, da hast du recht. Hab ich vergessen reinzutippen.


------------------------------------------------------------------------------------------------------------------------------
Fehlerzusammenfassung:
(1) Arrays nicht per == vergleichen. Da vergleichst du nur Zeigeradressen. Nimm anstelle dessen für C-Strings (Nullterminierte char-Arrays) einfach std::strcmp (Header: <cstring>)
Aus diesem Grund sollte die if-Abfrage NIE wahr sein!
(2) Du hast keinen gültigen C-String an die fopen-Funktion übergeben.
 
@Devil
wenn namespace global setzen keinen Sinn hätte würde diese Option wohl kaum implementiert sein :)
Für kleine Projekte bzw. solange man keine eigenen Funktionen mit gleichen Namen schreibt ist das doch völlig legitim und sinnvoll. Daher muss ich Beichtpfarrer Recht geben.

mfg
 
Gegen ein lokales using namespace habe ich auch nichts:
C++:
int main()
{
    using namespace std;
    cout << "Das ist ein Auto!\n";
}
... kein Problem! Da kannst du es überblicken, ob du bereits einen anderen Namensraum als std nutzt usw.
 
Zurück