我一直为变量howMany返回相同的值

时间:2016-06-12 00:34:52

标签: c++ file struct header

我有一个以前填充过数据的文件。该文件由一组结构组成。每个结构代表一个圆形,每个阵列位置代表一个人最多20轮。我的.h文件:

define READTWENTY_H

class readTwenty {

public:
    readTwenty();
    void nonZeroes(int, int &);

   struct a_round {
    int score;
    double course_rating;
    int slope;
    char date[15];
    char place[40];
    char mark[1];
    }; //end structure definition

    struct a_round all_info[20];

FILE *fptr;

}; //end class
#endif

在数据文件中,一些“回合”中包含实际数据,有些则先前已填充零。我想数零轮。我有一个循环,我可以要求另一个“人”值看。该值被发送到一个函数,在该函数中确定零回合的数量,并通过引用名为“howMany”的变量返回。

// readMember.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"
#include <iostream>
#include "readTwenty.h"

using namespace std;

int main()
{
    int person = 0;
    readTwenty personData;
    int howMany = 0;

while (person != -999) {
    cout << "Which member (keyfield)  would you like to see? -999 to stop ";
    cin >> person;

    if (person == -999)
        exit(0);

    personData.nonZeroes(person-1, howMany);
    cout << "The number of non-zero values for this member is " << howMany << endl;
}//end while

return 0;
}

一旦作为“密钥”发送到非零函数,我在文件中创建一个偏移量并读取该个体的20轮,并通过引用将计数值返回到调用例程变为howMany变量。

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include "readTwenty.h"
#include <errno.h>
#include <cstdio>

readTwenty::readTwenty() {
const char *configfile;
configfile = "scores.dat";

#ifdef WIN32
   errno_t err;

if((err = fopen_s(&fptr,configfile, "rb")) != 0)
   #else
if ((fp_config = fopen(configfile, "rb")) == NULL)
#endif
    fprintf(stderr, "Cannot open cinfig file %s!\n", configfile);

   }//end constructor

void readTwenty::nonZeroes(int key, int &count) {

int zeroes = 0;

int offset = key * ((sizeof(all_info[0]) * 20));
fseek(fptr, offset, SEEK_SET);

for (int i = 0; i < 20; i++){
    fread(&all_info[i], sizeof(all_info[0]), 1, fptr);
    if (all_info[i].score == 0)
       zeroes++;
   all_info[i].mark[0] = ' ';
  }//end for loop

count = 20 - zeroes;
fclose(fptr);

}//end of function nonZeroes

问题是我给人的第一个值带回正确数量的非零轮。然而,无论我为人提供的第二个值,while循环的每个后续迭代都会返回与第一个人相同的结果?非常感谢您的任何想法。

1 个答案:

答案 0 :(得分:0)

我目前没有计算机可以验证,但有一行跳出来,因为这是一个常见错误(至少对我来说):

fread的第一个参数是&all_info[i];你可能想要&(all_info[i]),但这不是编译器理解它的方式 - &强于[i],所以你得到(&all_info)[i]

您也可以使用all_info+i获得同样的效果。