【问题标题】:crash when reading from a file从文件读取时崩溃
【发布时间】:2014-12-02 08:36:15
【问题描述】:

首先,我想让你知道我是一名大学生(我们的编程课程还没有那么高级)(顺便说一句,我没有要求我的作业等答案,我只是在练习)。

好的,我有两个问题

  1. 我的代码中的某些函数改变了我的数组的值(当我不想要它时)
  2. 我真的不知道,但似乎从文件中获取一些值以存储到我的数组中会使程序崩溃,此外,在稍微修改一下代码之后(我不知道发生了什么变化),它不再崩溃在上述部分中,但它仍然在代码执行结束时崩溃..

我希望你们能帮助我,我整天都在寻找。

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>

using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void readFile (float x[], int &y) {
    ifstream load;
    string filename;
    cout << "Enter the name of the file: ";
    cin >> filename;

    load.open(filename.c_str());
    while (!load.eof()) {
        load >> x[y];
        y++;
    }
    if (!load) {
        cout << "asd";
    }

}

void computeC (float x[], int y, float z[]) {
    int v=0;

    for (v=0; v<=y; v++) {
        z[v] = (5 * (x[v] - 32)/9);
    }
}

float average (float x[], int y) {
    int v=0;
    float sum=0;
    for (v=0; v<=y; v++) {
        sum += x[v];
    }

    return sum / v;
}

void grade (float x[], char grades[], int y, int &hi, int &med, int &lo) {
    int v=0;
    hi = med = lo = 0;
    for (v=0; v<=y; v++) {
        if ( x[v] >= 35) {
        grades[v] = 'H';
        hi++;
        }

        else if ( (x[v] < 35) && (x[v] >= 20) ) {
        grades[v] = 'M';
        med++;
        }

        else if ( x[v] < 20 ) {
        grades[v] = 'L';    
        lo++;
        }
    }

}

void writeFile (float x[], float y[], int z, char w[]) {
    ofstream save;
    int v=0;


    for (v=0; v <= z; v++) {
        cout << "C(Celcius)" << left << setw(5);
        cout << "F(Farenheit)" << left << setw(5);
        cout << "Description\n";
        cout << right << setw(7) << y[v];
        cout << left << setw(8) << x[v];
        cout << left << setw(8) << w[v];        
    }
}
int main(int argc, char** argv) {
    int ctr=0, high, medium, low;
    float F[ctr], C[ctr], ave;
    char grades[ctr];


    readFile (F, ctr);
    computeC (F, ctr, C);
    ave = average (C, ctr);
    grade (C, grades, ctr, high, medium, low);

    cout << "Average of the temperatures: " << ave << endl;
    cout << "Number of high temperatures: " << high << endl;
    cout << "Number of medium temperatures: " << medium << endl;
    cout << "Number of low temperatures: " << low << endl;

    //writeFile (F, C, ctr, grades);


    return 0;
}

(来自https://drive.google.com/file/d/0BxeZTCUL3Q4oZHlqWFdjMDZub0E/view?usp=sharing的代码)

【问题讨论】:

标签: c++ arrays file crash


【解决方案1】:

不检查整个代码,我可以直接想到代码的某些部分。

让我开始

while (!load.eof()) {
        load >> x[y];
        y++;
    }

如果您写入的值超出 x[] 可以容纳的数量,那么您的程序将在这种情况下崩溃。

确保只写入您的数组,直到分配的最大内存。

问题是 !load.eof() 不会做你期望它做的事情,因为它将从文件末尾之外读取。它会多次执行你的循环。

第二:

 int ctr=0, high, medium, low;
    float F[ctr], C[ctr], ave;
    char grades[ctr];

ctr0,因此您声明 F, c and grades 的数组包含 0 个元素。这不是很聪明;)你不能从他们那里读或写。

【讨论】:

  • 我该如何解决这个问题?我尝试不将 ctr 初始化为 0(这会使程序在启动时崩溃)。我需要程序本身来确定要存储到数组中的数据数量(反过来,数字变成数组的大小)有什么办法可以做到这一点吗?
  • 是的,有几种方式。您可以使用像 std::vector 这样的“容器”,也可以在运行时使用“new”运算符动态分配内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 2012-10-12
  • 2020-12-07
  • 2018-06-18
  • 1970-01-01
相关资源
最近更新 更多