1
#include <string>
#include <iostream>
#include <fstream>
#include <windows.h>
#include <wininet.h>
#include <winsock.h>
#include <stdio.h>
#include <stdarg.h>

#pragma comment(lib, "wininet.lib")

using namespace std;

const int file_l = 100;

int getpage()
{
    HINTERNET hOpen, hURL;
    LPCWSTR NameProgram = L"Webreader";             //LPCWSTR == Long Pointer to Const Wide String 
    LPCWSTR Website;                    
    char file[file_l];
    unsigned long read;

    //Always need to establish the internet connection with this funcion.  
      if ( !(hOpen = InternetOpen(NameProgram, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 )))
        {
            cerr << "Error in opening internet" << endl;
            return 0;
        }                       
    Website = L"http://www.sec.gov/Archives/edgar/data/1535079/000100201413000137/R2.htm";
    hURL = InternetOpenUrl( hOpen, Website, NULL, 0, 0, 0 );            //Need to open the URL

    ofstream fout("Summer Research testing.txt");

    InternetReadFile(hURL, file, file_l, &read);
    while (read == file_l)
        {
            InternetReadFile(hURL, file, file_l, &read);
            file[read] = '\0';
            cout << file;
            fout << file;
        }
    fout.close();

    cout << endl;
    InternetCloseHandle(hURL);
    return 0;
}

int main()      
{
    getpage();
}

above is my code. I'm a beginner. Programming C++, using Visual Studio 2010

I have keep having the error: "Run-Time Check Failure #2 - Stack around the variable 'file' was corrupted."
what I thought was that I shouldn't make the "*char file[file_l];*" the same length as others, so I changed it to "*char file[file_l+1];" Apparently, problem solved, no more error. Could you please let me know whether this is the right way to fix this error?

Also, the program didn't print all the HTML code of the webpage in to the file "
"Summer Research testing.txt"*"as I wanted. it didn't print from the line 1 and always stopped at line 209. I have changed things around, but very little progress. please help.

Any help is greatly appreciated!

5
  • 1
    file[read] = '\0'; will cause undefined behavior if read == 100 since you are accessing 1 past the end of the file array. Your fix is correct. Commented May 29, 2013 at 19:47
  • As for the problem with the html. You are discarding the first read always by not outputting what was in file before the while loop and also not displaying what was in the file array on the last read if the read size was not 100 bytes. Commented May 30, 2013 at 12:32
  • @drescherjm Thank you so much for help!! could you please explain this a bit more? Commented May 30, 2013 at 14:20
  • I will try to post an answer (time permitting) this evening (10 or so hours) if no one answers this by that time. Commented May 30, 2013 at 14:23
  • @drescherjm Thank you so much for willing to help!! looking forward, I'll work on it in the meantime. thanks again! Commented May 30, 2013 at 14:27

3 Answers 3

1

Copying from my comments to the original post:
file[read] = '\0'; will cause undefined behavior if read == 100 since you are accessing 1 past the end of the file array. Your fix for this correct:

 char file[file_l+1];

For the output problem:
You are discarding the first read always by not outputting what was in file before the while loop and also not displaying what was in the file array on the last read if the read size was not 100 bytes.

To fix this I rewrote your while loop a little:

InternetReadFile(hURL, file, file_l, &read);
while (read > 0)
{
     // Something was read we should output it now!
    file[read] = '\0';
    cout << file;
    fout << file;
    InternetReadFile(hURL, file, file_l, &read);
}

By moving the second InternetReadFile() call to after the code that outputs it we get no longer discard the first read without outputting it. Also I changed the comparison to read > 0 to fix 2 problems: Reads of less than 100 bytes and the final read.

I have included both fixes in my changes to your code here:

#include <string>
#include <iostream>
#include <fstream>
#include <windows.h>
#include <wininet.h>
#include <winsock.h>
#include <stdio.h>
#include <stdarg.h>

#pragma comment(lib, "wininet.lib")

using namespace std;

const int file_l = 100;

int getpage()
{
    HINTERNET hOpen, hURL;
    LPCWSTR NameProgram = L"Webreader";             //LPCWSTR == Long Pointer to Const Wide String 
    LPCWSTR Website;                    
    char file[file_l+1]; // Add an additional character for '\0'
    unsigned long read;

    //Always need to establish the internet connection with this function.  
    if ( !(hOpen = InternetOpen(NameProgram, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 )))
    {
        cerr << "Error in opening internet" << endl;
        return 0;
    }                       
    Website = L"http://www.sec.gov/Archives/edgar/data/1535079/000100201413000137/R2.htm";
    hURL = InternetOpenUrl( hOpen, Website, NULL, 0, 0, 0 );            //Need to open the URL

    ofstream fout("Summer Research testing.txt");

    InternetReadFile(hURL, file, file_l, &read);
    while (read > 0)
    {
         // Something was read we should output it now!
        file[read] = '\0';
        cout << file;
        fout << file;
        InternetReadFile(hURL, file, file_l, &read);
    }
    fout.close();

    cout << endl;
    InternetCloseHandle(hURL);
    return 0;
}

int main()      
{
    getpage();
}
Sign up to request clarification or add additional context in comments.

4 Comments

Thank you so much for your great help! greatly appreciate!! it's great!
Could I have one additional question? I'm currently working on how to remove the HTML tags I got from the webpage. then I found that this while function does not read the sentence line by line, and I lost my way out a bit. Could you please help me out a bit? Thanks!
Remember that html does not need to have newlines at all (it could be 1 single line) so having it split the output at newlines will not work in all cases. Anyways to solve your problem you could make the fout a stringstream and process that after the reading was done (after the InternetCloseHandle() call).
Thank you very much sir! I read the HTML code into an array, and hope to make something happen with each line of code in the array, after doing that, then input that into a file.
0

read should NEVER be >= file_l! That means you have to write

while (read == file_l - 2)

and

file[read-1] = '\0';

(file_l - 2 because the last byte must be reserved for '\0') I hope you realize that the while loop executes your statements only if the buffer "read" (which should be of type LPVOID and not char *) is full. By the way, your application is almost completely written in C, not C++.

1 Comment

From the msdn documentation for InternetReadFile I believe read will be equal to file_1 when there are atleast file_1 bytes to read.
-1
#include<iostream>
#include<string>
#include<stdlib.h>
#include<conio.h>
#include<fstream>
#include<string.h>
using namespace std;

class Date
{ protected:
   int Day;
   int month;
   int year;

public:


    Date()
    {
        this->Day=01;
         this-> month=01;
        this-> year=1990;

    }
    Date(int _day,int _month,int _year)
    {this-> Day=_day ; this-> month=_month; this-> year=_year;


    }


    void display()
    {

        cout<<" Day/month/year :"<<Day<<"/"<<month<<"/"<<year<<endl;

    }


};
class Login
{
protected:
string UserName;
char password[6];

public:


    Login() 
{
    this->UserName="User";
    this->  password[6]='1','2','3','4';

}


Login (string user,char pass[6])
{
    this->UserName=user;
    this->password[6]=pass[6];

}
void setUser(string a)
{
    this->UserName=a;
}
void setPass(char c[6])
{
 this->password[6]=c[6];

}

string getuser()
{

    return this->UserName;
}
char getPass()
{
    return this->password[6];

}


};



class customer
{
protected:
    string Name;
    string Address;
    int age;
    int customer_no; 
    Date DOfReg ;
    Date DOfBirth ;
    string contact_no;
    Login A ;

    friend class Admin;

public:

    ofstream f;

        customer()
        {
            age=customer_no=0;
        }  
                customer (string _Name ,string _Address,int _age,int _customerNo,Date DOB,Date DOR,string contactNo,Login a)
                {

                    this->  Name=_Name;
                this->    Address=_Address;
                this->    age=_age;
                this->   customer_no=_customerNo; 
                this->   DOfReg= DOR ;
                this->    DOfBirth= DOB ;
                this->  contact_no = contactNo;
              this-> A=a;

      f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
                f.close();
                }

                void setName(string name) { this->Name=name;}
                void SetAddress( string add) { this->Address=add;}
                void setAge(int Age) { this->age=Age;}
                void SetCutomer(int no) {this->customer_no=no;}
                void setDOR(Date dor) {this->DOfReg=dor;}
                void setDOb(Date dob) { this-> DOfBirth=dob;}
                void setContact(string contact) { this-> contact_no=contact;}
                void setLogin(Login ID) { this-> A=ID;}


                virtual void passchange(Login ID)
                {}  
                virtual bool checkID(Login )
        { return 0;
        }



        virtual void Reg()
        {


        }

        virtual void updateinfo()
        {

        }

        virtual void Show()
        {


        }

        virtual float paymentType()
        {
            return 0;

        }



};
class Admin
{
protected:
    Login A;
public:
    ofstream f;
    Admin()
    {
        string Y="Admin"; char z[5]={"4321"};
        A.setUser(Y);
        A.setPass(z);
    cout<<z[5];
    }

Admin(Login ID)
    {
        A=ID;


    }

    bool checkID(Login ID)
    {
        if(A.getuser()==ID.getuser()&&A.getPass()==ID.getPass())
        {return true;
        }
        else return false;


    }


     void Reg(customer& a)
    {

                  int c=0;
                cout<<"Enter Name :"<<endl;
                getline(cin,a.Name);
                cin.ignore();
                cout<<"\nEnter Address :"<<endl;
                getline(cin,a.Address);
                cout<<"\nEnter Age :"<<endl;
                cin>>a.age;
                a.customer_no=c;
               int q,b,d;
        do{
             cout<<"\nEnter Date Of Regestration  ";        cout<<"Format: DD/MM//YYYY"<<endl;

                cin>>q;
                cin>>b;
                cin>>d;
                if (q<=31&&b<=12&&d<2014)
                { Date DOR(q,b,d);
                    a.DOfReg = DOR ;break;
                }
        }while(q>31&&b>12&&d>2013);

                do
                {
                    cout<<"\nEnter Date Of Birth  ";         cout<<"Format: DD/MM//YYYY"<<endl;

                    cin>>q;cin>>b;cin>>d;
                if (q<=31&&b<=12&&d<2014)
                {
                    Date DOB(q,b,d);
                    a.DOfBirth= DOB ;break;}
                else {cout<<"\nWrong Format/Date :"<<endl;}

                }while(q>31&&b>12&&d>2013);
                cout<<"\nEnter Your Contact No. :";        cout<<"Format: 0322-1234567 "<<endl;
                getline(cin,a.contact_no);
cin.ignore();
        c++;
    f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
f.close();
     }

};

class PTCL : public customer
{
protected:

public:
    fstream f;

    void Reg( )
        {
            int c=0;
            cin.clear();
                cin.ignore();
                cout<<"\nEnter Name :"<<endl;
                getline(cin,Name);
                cin.ignore();
                cout<<"\nEnter Address :"<<endl;
                getline(cin,Address);cin.ignore();
                cout<<"\nEnter Age :"<<endl;
                cin>>age;
                customer_no=c;
               int a;
                   int b;
                   int d;
        //do{
             cout<<"\nEnter Date Of Regestration  ";        cout<<"Format: DD/MM//YYYY"<<endl;

                cin>>a;cin>>b;cin>>d;
    //          if (a<=31&&b<=12&&d<2014)
                 Date DOR(a,b,d);
                    DOfReg = DOR; //break;
                    //else {cout<<"\nWrong Format/Date :"<<endl;}
    //  }while(a>31&&b>12&&d>2013);

        //      do
            //  {
                //  cout<<"\nEnter Date Of Birth  ";         cout<<"Format: DD/MM//YYYY"<<endl;

                //  cin>>a;cin>>b;cin>>d;
//              if (a<=31&&b<=12&&d<2014)
    //          {
                    //Date DOB(a,b,d);
                    //DOfBirth= DOB ;//break;
            //  }
        //      else {cout<<"\nWrong Format/Date :"<<endl;}

            //  }while(a>31&&b>12&&d>2013);

            cin.clear();cin.ignore();       cout<<"\nEnter Your Contact No. :";        cout<<"Format: 0322-1234567 "<<endl;
                getline(cin,contact_no);cin.ignore();

        c++;
    f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
                f.close();  }

    void passchange(Login ID)
    {
        cout<<"Enter New UserName :"<<endl;
        string User;

        getline(cin,User);
        A.setUser(User);
        char  c[5];
        cout<<"Enter New Password Of 4 letters"<<endl;;
        cin>>c[5];
        A.setPass(c);
        f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
                f.close();

    }


    bool checkID(Login ID)
    {
        if(A.getuser()==ID.getuser()&&A.getPass()==ID.getPass())
        {return true;
        }
        else return false;


    }


    void updateinfo( )
        {
        int x=0;
            cout <<"Which Info You Want to Update"<<endl;
            cout<<"1. Name :" << Name<<endl;
            cout<<"2. Address :"<< Address<<endl;
            cout<<"3. Age :"<< age<<endl;

            cout<<"4. Date Of Birth :"; DOfBirth.display(); cout<<endl;
            cout<<"5. Contact No :"<<contact_no<<endl;
            cout<<endl;
            char choice;

            do
            {
                cout<<"choice :"<<endl;
                cin>>x;

                if (x==1)
            {   cout<<"Enter New Name "<<endl;
                getline(cin,Name); 
f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
                f.close();
            }
                else if  (x==2)
           {
             cout<<"Enter New Address "<<endl;
             getline(cin,Address);
f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
                f.close();
            }
                else if(x==3)
                { 
                    cout<<"Update Your Age :"<<endl;
                    cin>>age;
    f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
                f.close();      
                }
                else if(x==4)
                {
                    cout<<"Update Your Birth info:"<<endl;
                    int a,b,c;
                    cin>>a;cin>>b;cin>>c;
                    Date dOb(a,b,c);   
                    setDOb( dOb);

    f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
                f.close();
                }
                else if(x==5)
                {
                    cout<<"Update Your Contact No: "<<endl;
                    cin>>contact_no;
                f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
                f.close();
        } 
                else
                {
                cout<<"Wrong input "<<endl;
                }
cout<<"Do Yo Want to Update More (Y/N):"<<endl;
                cin>>choice;
            }while(choice=='N');
            cout<<"Information Updated !! "<<endl;
    }

    void Show()
    {
            cout<<"1. Name :" << Name<<endl;
            cout<<"2. Address :"<< Address<<endl;
            cout<<"3. Age :"<< age<<endl;
            cout<<"4. Date Of Birth :"; DOfBirth.display(); cout<<endl;
            cout<<"5. Contact No :"<<contact_no<<endl;
            cout<<"6. date of registration : "; DOfReg.display();cout<<endl;
            cout<<"7. customer no. : "<<customer_no<<endl;
            f.open("person.dat",ios::in|ios::out|ios::app);
            ifstream f1;
              f1.read(reinterpret_cast<char*>(this),sizeof (*this));

    }

};

class dell : public customer
{
protected:
    string country;
public:
    fstream f;
    dell()
    {

    country="USA"; f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
                f.close();  
    }

    dell(string _Name ,string _Address,int _age,int _customerNo,Date DOB,Date DOR,string contactNo,string count)
        {
                Name=_Name;
                Address=_Address;
                age=_age;
                customer_no=_customerNo; 
                DOfReg= DOR ;
                DOfBirth= DOB ;
                contact_no = contactNo;
                country=count;
            f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
                f.close();
    }

      bool checkID(Login ID)
    {
        if(A.getuser()==ID.getuser()&&A.getPass()==ID.getPass())
        {return true;
        }
        else return false;


    }

    void Reg()
        {
             string uName;  int c=0;cin.ignore();
                cout<<"Enter Name :"<<endl;
                getline(cin,Name);
                cin.ignore();
                cout<<"\nEnter Address :"<<endl;
                getline(cin,Address);
                cout<<"\nEnter Age :"<<endl;
                cin>>age;
                customer_no=c;
               int a,b,d;
        do{
             cout<<"\nEnter Date Of Regestration  ";        cout<<"Format: DD/MM//YYYY"<<endl;

                cin>>a;cin>>b;cin>>d;
                if (a<=31&&b<=12&&d<2014)
                { Date DOR(a,b,d);
                    DOfReg = DOR ;break; break;
                }
        }while(a<=31&&b<=12&&d<2014);

    cin.clear();
    do
                {
                    cout<<"\nEnter Date Of Birth  ";         cout<<"Format: DD/MM//YYYY"<<endl;

                    cin>>a;cin>>b;cin>>d;
                if (a<=31&&b<=12&&d<2014)
                {
                    Date DOB(a,b,d);
                    DOfBirth= DOB ;
                break;}
                else {cout<<"\nWrong Format/Date :"<<endl;}

                }while(a<=31&&b<=12&&d<2014);
               cin.clear(); 
            cin.ignore();
                cout<<"\nEnter Your Contact No. :";        cout<<"Format: 0322-1234567 "<<endl;
                getline(cin,contact_no);

            cin.clear(); 
            cin.ignore();
            cout<<"Create user Name "<<endl;
             getline(cin,uName);cin.clear(); 
            cin.ignore();
char p[6];
cout<<"Create PassWord "<<endl;               ///// hERE is The Eror " stack around P was corrupted
                                                    even if I Input only 1 digit !

cin>>p[6];
A.setPass(p);
A.setUser(uName);
c++;
    f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
                f.close();
            }

void updateinfo( )
        {
        int x=0;
            cout <<"Which Info You Want to Update"<<endl;
            cout<<"1. Name :" << Name<<endl;
            cout<<"2. Address :"<< Address<<endl;
            cout<<"3. Age :"<< age<<endl;

            cout<<"4. Date Of Birth :"; DOfBirth.display(); cout<<endl;
            cout<<"5. Contact No :"<<contact_no<<endl;
            cout<<"6. country : "<<country;
            cout<<endl;
            char choice;

            do
            {
                cout<<"choice :"<<endl;
                cin>>x;

                if (x==1)
            {   cout<<"Enter New Name "<<endl;
                getline(cin,Name);cin.ignore(); 
                 f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
                f.close();
            }
                else if  (x==2)
           {
             cout<<"Enter New Address "<<endl;
             getline(cin,Address); cin.ignore();    
            f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
                f.close();
            }
                else if(x==3)
                { 
                    cout<<"Update Your Age :"<<endl;
                    cin>>age;   
                    f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
                f.close();
                }
                else if(x==4)
                {
                    cout<<"Update Your Birth info:"<<endl;
                    int a,b,c;
                    cin>>a;cin>>b;cin>>c;
                    Date dOb(a,b,c);   
                    setDOb( dOb);
                    f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
                f.close();
                }
                else if(x==5)
                {
                    cout<<"Update Your Contact No: "<<endl;
                    cin>>contact_no;    
                f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (*this));
                f.close();
                } 
                else if(x==6)
                {
                cout<<"Update Country Name : "<<endl;
                cin>>country;   
                f.open("person.dat",ios::in|ios::out|ios::app);
              f.write(reinterpret_cast<char*>(this),sizeof (this));
                f.close();
                }
                else
                {
                cout<<"Wrong input "<<endl;
                }
cout<<"Do Yo Want to Update again (Y/N):"<<endl;
                cin>>choice;
            }while(choice=='N');
            cout<<"Information Updated !! "<<endl;
    }

    void Show()
    {
    cout<<"1. Name :" << Name<<endl;
    cout<<"2. Address :"<< Address<<endl;
    cout<<"3. Age :"<< age<<endl;
    cout<<"4. Date Of Birth :"; DOfBirth.display(); cout<<endl;
    cout<<"5. Contact No :"<<contact_no<<endl;
    cout<<"6. date of registration : "; DOfReg.display();cout<<endl;
    cout<<"7. customer no. : "<<customer_no<<endl;
    cout<<"8. country : "<<country<<endl;

            ifstream f1;
    f1.open("person.dat",ios::in|ios::out|ios::app);          f1.read(reinterpret_cast<char*>(this),sizeof (*this));

    }
};

void main()
{

    customer *ptr[100];

    string Name;
    string Address;
    int age;
    int customer_no;
    Date DOfReg;
    Date dofbirth;
    string contact_no;
    string country;

     int c;
    int count;
    char choice;
     string User;
     char Pin[6];
     int p;
    for (int i=0;i<100;i++) 
    {
                     cout<<"\n\n********======================*******\n\n"<<endl;
        cout<<" \n             Welcome To Customer Services            "<<endl;

         cout<<"\n1. Login for  Registerd Member (PTCL/UFONE) "<<endl;
         cout <<"\n2. SignUp for Regestration   (PTCL/UFONE ) "<<endl;
         cout<<"\n3. Search for Regesterd Memebers (Only for Admin) "<<endl; 
         cout<<"\Choice  :"<<endl;
         cin>>c;

        if (c==1)
        {
            cin.ignore();
            cout<<"\n Enter User Name "<<endl;
            getline(cin,User);
            //std::cin.ignore();
            cout<<"\nEnter Pin of no More than 4 characters"<<endl;
         for (int i=0;i<20;i++)
   {
    Pin[i]=getch();
    if (Pin[i]==13)
    {
     Pin[i]=0;
     break;
    }
    if (Pin[i]!=8)
    cout << "*";
   }

        Login ID(User,Pin);    //PassWord Sent Here;

        if (ptr[i]->checkID(ID))   //Password match Check
        {


            cout<<"\n  Welcome "<<endl;
         cout<<"\n1. for Update Info "<<endl;
         cout<<"\n2. for View Info "<<endl;
        cout<<"\n3. for Pass change"<<endl;
        cout<<"\n Choice "<<endl;
        cin>>count;

        if (count==1)
        {
            ptr[i]->updateinfo();
         }
        else if(count==2)
        {
            ptr[i]->Show();

         }
        else if(count==3)
        {
            ptr[i]->passchange(ID);
        }


        } //Check ID if  bracket
else {

            cout<<"\nUserName Or PassWord is Invalid: "<<endl;}
    }//c==1 bracket 
        else if (c==2)
    {
        cout<<"\nWhoose Customer You Want To be Dell(D)  / PTCL(P) "<<endl;
        cin>>choice;
        if (choice=='D'||'d')
        {
            ptr[i] = new dell;
            ptr[i]->Reg();
        }
        else if (choice=='P'||'p')
        {
            ptr[i]=new PTCL;
            ptr[i]->Reg();
        }
        else {cout<<"\nWrong Choice" <<endl;
        }
    }
    }   

getch();
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.