【问题标题】:Run time error with .txt files loading using getline, strcpy, strtok c++使用 getline、strcpy、strtok c++ 加载 .txt 文件时出现运行时错误
【发布时间】:2014-01-13 09:23:40
【问题描述】:

我在从 .txt 文件加载数据时遇到问题。问题是有时代码运行完美,但大多数时候我只是遇到运行时错误。有趣的是,我没有对代码做任何更改,有时会出错,有时根本没有错误!

void CustomersDB::LoadCustomersDATA()
{
    string temp;
    char *str = new char[temp.length() + 1];
    char *p;
    int i, Temp;

    ifstream CustomerFile("CustomersData.txt");
    while (getline(CustomerFile, temp))
    {
        strcpy(str, temp.c_str());
        p = strtok(str, ",");
        string IDNumber = p;
        p = strtok(NULL, ",");
        int Type = atoi(p);
        p = strtok(NULL, ",");
        string FirstName = p;
        p = strtok(NULL, ",");
        string LastName = p;
        p = strtok(NULL, ",");
        string PhoneNumber = p;
        p = strtok(NULL, ",");
        string DateOfBirth = p;
        p = strtok(NULL, ",");
        string Address = p;

        if (Type == 1)
        {
            CustomersDB::getInstance()->AddNewCustomer(new     RegularCustomers(IDNumber, Type, FirstName, LastName, PhoneNumber, DateOfBirth, Address));
            i = FindCustomerIndex(IDNumber);
            p = strtok(NULL, ",");
            Temp = atoi(p);
            while (p != NULL)
            {
                CustomersDB::getInstance()->Client[i]->addAccountsToAllowed(Temp);
                p = strtok(NULL, ",");
            }
        }
        else if (Type == 2)
        {
            CustomersDB::getInstance()->AddNewCustomer(new GoldCustomers(IDNumber, Type, FirstName, LastName, PhoneNumber, DateOfBirth, Address));
            i = FindCustomerIndex(IDNumber);
            p = strtok(NULL, ",");
            Temp = atoi(p);
            while (p != NULL)
            {
                CustomersDB::getInstance()->Client[i]->addAccountsToAllowed(Temp);
                p = strtok(NULL, ",");
            }
        }
        else if (Type == 3)
        {
            CustomersDB::getInstance()->AddNewCustomer(new PlatinumCustomers(IDNumber, Type, FirstName, LastName, PhoneNumber, DateOfBirth, Address));
            i = FindCustomerIndex(IDNumber);
            p = strtok(NULL, ",");
            Temp = atoi(p);
            while (p != NULL)
            {
                CustomersDB::getInstance()->Client[i]->addAccountsToAllowed(Temp);
                p = strtok(NULL, ",");
            }
        }
    }

    CustomerFile.close();
}

.txt 文件包含用逗号分隔的信息。

303047898,1,Josh,Hardwell,050-8103580,7/7/89,NY,0

希望您能快速找到解决方案,因为我已经尝试了所有方法,但我迷路了!! 谢谢!

【问题讨论】:

    标签: c++ text getline strtok strcpy


    【解决方案1】:

    您正在这里创建一个大小为1char 数组:

    string temp; // temp.length() == 0
    char *str = new char[temp.length() + 1];
    

    然后你在这里使用它,就好像它有更大的尺寸:

    strcpy(str, temp.c_str()); // temp.length() > 1 after getline
    

    【讨论】:

    • 非常感谢!!我刚刚将字符串 temp 的长度调整为 50(或任何足够大的值),它就像一个魅力!
    • @user3134453 很高兴它有帮助。但是您的解决方案听起来很脆弱。一旦你得到一个太长的行,你的申请就会失败。
    • 它有点脆弱,虽然现在很适合我。
    猜你喜欢
    • 2017-09-15
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2011-08-16
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多