Search code examples
c++stringpointersifstream

Update: program shows adress of fstream instead of the text file


I am about to write a program which asks the user if they want to "search or convert" a file, if they choose convert, they need to provide the location of the file.

I do not know why the program shows the address of the file instead of opening it.

Here is my first approach:

#include <fstream>
#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main()
{

char dateiname[64], kommando[64];

    ifstream iStream;


    cout << "Choose an action: " << endl <<
            " s - search " << endl <<
            " c - convert" << endl <<
            " * - end program" << endl;
    cin.getline(kommando,64,'\n');
    switch(kommando[0])
    {
        case 'c':
            cout << "Enter a text file: " << endl;
            cin.getline(dateiname,64,'\n');
            iStream.open("C://users//silita//desktop//schwarz.txt");
        case 's': break;
        case '*': return 0;
        default:
            cout << "Invalid command: " << kommando << endl;
    }
    if (!iStream)
    {
         cout << "The file " << dateiname << " does not exist." << endl;
    }
    string s;
    while (getline(iStream, s)) {
        while(s.find("TIT", 0) < s.length())
            s.replace(s.find("TIT", 0), s.length() - s.find("TIT", 3),"*245$a");
        cout << iStream << endl;
    }    
    iStream.close();
}

Solution

  • As mentioned in Lassie's answer, you can't compare strings in this way using c or c++; just to flesh it out, however, I'll explain why.

    char MyCharArr[] = "My Character Array"
    // MyCharArr is now a pointer to MyCharArr[0], 
    // meaning it's a memory address, which will vary per run 
    // but we'll assume to be 0x00325dafa   
    if( MyCharArr == "My Character Array" ) {
        cout << "This will never be run" << endl;
    }
    

    Here the if compares a pointer (MyCharArr) which will be a memory address, ie an integer, to a character array literal. Obviously 0x00325dafa != "My Character Array".

    Using cstrings (character arrays), you need to use the strcmp() function which you will find in the cstring library, which will give you a number telling you "how different" the strings are, essentially giving the difference a numerical value. In this instance we are only interested in no difference, which is 0, so what we need is this:

    #include <cstring>
    using namespace std;
    char MyCharArr[] = "My Character Array"
    if( strcmp(MyCharArr,"My Character Array")==0 ) { 
        // If there is 0 difference between the two strings...
        cout << "This will now be run!" << endl;
    }
    

    While you are not doing so in your question, If we were using c++ strings rather than character arrays, we would use the compare() method to similar affect:

    #include <string>
    using namespace std;
    string MyString = "My C++ String"
    if( MyString.compare("My C++ String")==0 ) { 
        // If there is 0 difference between the two strings...
        cout << "This will now be run!" << endl;
    }