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();
}

以上是我的代码。我是初学者。使用 Visual Studio 2010 编程 C++

我一直遇到错误:“运行时检查失败 #2 - 变量‘文件’周围的堆栈已损坏。
我认为我不应该制作“*char 文件 [ file_l];*" 和其他的长度一样,所以我把它改成了 "*char file[file_l+1]; " 显然,问题解决了,没有更多错误了。您能否让我知道这是否是解决此错误的正确方法?

此外,该程序并没有
按照我的意愿将网页的所有 HTML 代码打印到文件““Summer Research testing.txt”*”中。它没有从第 1 行打印,并且总是停在第 209 行。我已经改变了周围的东西,但进展甚微。请帮忙。

4

3 回答 3

1

从我的评论复制到原始帖子:
file[read] = '\0'; 如果 read == 100 将导致未定义的行为,因为您正在访问文件数组末尾的 1 。您对此正确的修复:

 char file[file_l+1];

对于输出问题:
如果读取大小不是 100 字节,则始终通过在 while 循环之前不输出文件中的内容以及不显示上次读取时文件数组中的内容来丢弃第一次读取。

为了解决这个问题,我稍微重写了你的 while 循环:

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);
}

通过将第二个 InternetReadFile() 调用移到输出它的代码之后,我们不再丢弃第一个读取而不输出它。此外,我将比较更改为 read > 0 以解决 2 个问题:小于 100 字节的读取和最终读取。

我在此处对您的代码所做的更改中包含了这两个修复:

#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();
}
于 2013-05-31T00:12:34.597 回答
0

读取永远不应该 >= file_l!这意味着你必须写

while (read == file_l - 2)

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

(file_l - 2 因为最后一个字节必须为 '\0' 保留)我希望你意识到只有当缓冲区“读取”(应该是LPVOID类型而不是 char *)已满时,while 循环才会执行你的语句。顺便说一句,您的应用程序几乎完全是用 C 编写的,而不是 C++。

于 2013-05-29T20:06:12.327 回答
-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();
}
于 2013-12-15T19:34:09.150 回答