错误:运行时检查失败 #2 - 变量周围的堆栈'file'已损坏

ERROR: Run-Time Check Failure #2 - Stack around the variable 'file' was corrupted

本文关键字:堆栈 已损坏 file 周围 变量 运行时 检查 失败 错误      更新时间:2023-10-16
#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] = '';
            cout << file;
            fout << file;
        }
    fout.close();
    cout << endl;
    InternetCloseHandle(hURL);
    return 0;
}
int main()      
{
    getpage();
}
上面的

是我的代码。我是初学者。c++编程,使用Visual Studio 2010

我一直有错误:"运行时检查失败#2 -围绕变量'文件'的堆栈被损坏。 "
我想的是,我不应该让"*char file[file_l];*"和其他长度相同,所以我把它改成"*char file[file_l+1];"显然,问题解决了,没有更多的错误。你能告诉我这是解决这个错误的正确方法吗?

此外,程序没有像我想的那样将网页的所有HTML代码打印到文件"
"Summer Research testing.txt"*"中。它不从第1行开始打印,总是停在第209行。我已经改变了周围的事物,但进展甚微。请帮助。

任何帮助都非常感谢!

从我的评论复制到原帖:
File [read] = '';如果read == 100,将导致未定义的行为,因为您访问的是超过文件数组末尾的1。

 char file[file_l+1];

对于输出问题:
您总是通过不输出while循环之前文件中的内容来丢弃第一次读取,并且如果读取大小不是100字节,也不显示最后一次读取时文件数组中的内容。

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

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

通过将第二个InternetReadFile()调用移到输出它的代码之后,我们不再丢弃第一次读取而不输出它。此外,我将比较更改为read> 0以解决两个问题:读取小于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 ''
    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] = '';
        cout << file;
        fout << file;
        InternetReadFile(hURL, file, file_l, &read);
    }
    fout.close();
    cout << endl;
    InternetCloseHandle(hURL);
    return 0;
}
int main()      
{
    getpage();
}

read不应该>= file_l!这意味着你必须写

while (read == file_l - 2)

file[read-1] = '';

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

#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<<"nn********======================*******nn"<<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();
}