atof改变全局数组的值

时间:2012-04-06 01:34:28

标签: c++ visual-c++

我有一个问题,我基本上感到困惑。首先,我有两个全局数组 - trustArray []和fashionArray []。这是填充trustArray的函数:

void getTrust()
{
    string line;
    int reachedTrust=0;
    int numberOfTrustsRecorded=0;
    ifstream myfile ("BuyingJeans.Hw5 (1).csv");
    if (myfile.is_open())
    {
        while ( myfile.good() )
        {
            getline (myfile,line,',');
            //int found=line.find("Like-Purchase");
            if (line=="Trust-Like"){
                reachedTrust=1;
                getline (myfile,line,',');
            }
            if(reachedTrust==1){
                if(numberOfTrustsRecorded <6){
                    double testValue = atof(line.c_str());
                    trustArray[numberOfTrustsRecorded] = testValue;
                    numberOfTrustsRecorded++;
                }
            }
        }
        myfile.close();
    }
    else
        cout << "Unable to open file"; 
}

由于某种原因,此函数中的atof()正在更改fashionArray []中的两个值。如果我将atof()更改为atoi(),则问题不再发生。这是填充正在更改的数组的方法(fashionArray []):

void getFashion(){
string line;
int reachedFashion=0;
int numberOfFashionsRecorded=0;
ifstream myfile ("BuyingJeans.Hw5 (1).csv");
if (myfile.is_open())
{
    while ( myfile.good() )
    {
        getline (myfile,line,',');
        if (line=="Like-Fash -->"){
            reachedFashion=1;
            getline (myfile,line,',');
            //cout<<line<<endl;
            //getchar();
        }
        if(reachedFashion==1){
            if(numberOfFashionsRecorded <6){
                fashionArray[numberOfFashionsRecorded] = atoi(line.c_str());
                numberOfFashionsRecorded++;
            }
        }

    }
    myfile.close();
}

else cout << "Unable to open file"; 

}

以下是调用这两种方法的主要方法:

int main () {

getFashion();
getTrust();

for(int x=0; x<6;x++)
    cout<<fashionArray[x]<<endl;
getchar();
return 0;
}

fashionArray的前两个值最终被改为一些可笑的大的负面和正面整数。有趣的是,如果我颠倒main()方法中调用这两个方法的顺序,则问题不再发生。任何人都知道可能导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:2)

我认为你的写作超出trustArray并进入fashionArray。你没有提供初始化代码(请做),但我想它看起来像这样:

float trustArray[N];
float fashionArray[N];

N等于某个正整数。我猜你的情况是N=5

在循环中,您测试numberOfTrustsRecorded < 6。将通过该测试的numberOfTrustsRecorded的值为0,1,2,3,4,5。这是六(6)个浮点数以适合5的数组。写numberOfTrustRecorded[5]将覆盖内存。更改测试或将缓冲区大小增加到6。

为什么你没有在fashionArray [0]中看到有效值?我不知道。也许您的编译器与fashionArray内存缓冲区对齐,因此覆盖在未使用的内存中启动,从而使您只需要一半的位来使IEEE浮动。内存中的任何位构成随机浮点数。内存转储会显示问题。

为什么以相反的顺序运行方法有效?可能该错误仍然存​​在,但运行getFashion()秒可以清除getTrust()留下的混乱。你覆盖的记忆是你的,所以只要你不想弄清楚,没有人会抱怨。初始化fashionArray[0] = 0.0,运行getTrust()并在运行fashionArray[0]之前查看getFashion()。您可能会看到随机浮动。