使用指针向数组添加结构

时间:2013-01-31 16:32:16

标签: c pointers struct

我对C语言相当新,并且通常使用指针分配内存。无论如何,我正在尝试读取文件,将这些值放在结​​构中等等。我确切地知道我想要做什么,当然程序运行但是输出不正确并且有些混乱的数字和字母。

有一个文本文件,其中包含每行的新信息。每行代表一个对象。

这是文件中一行的外观:

meat sirloin 6.55 8 8.50 4

总的来说,我希望能够将所有PRODUCT个对象存储在一个数组中(所以我有一个结构数组)。所以我试图用指针分配内存,使用行数,然后将指针发送到一个名为read的函数。在读取中,我通过指针将每个结构添加到数组中。程序没有崩溃,输出不正确,我不知道为什么不。这是指针的问题。如果有人能帮助我,我会非常感激。任何帮助都会很棒。

      //prototype
void read(pointerToArr);


typedef struct
{
    char supType[15];
    char prodName[15];
    double wholePrice;
    int quantWhole;
    double retPrice;
    int retProdQuantity;
}PRODUCT;

FILE *fr;
int lineCount = 0;
int main()
{
    PRODUCT *ptr;

    int i;
    char check[50];


     fr = fopen("ttt.txt", "r");

      while(fgets(check, sizeof(check), fr)!= NULL)
      {
          if(check[0] != '\n')
          {
              lineCount++;
          }
      }
    // allocate memory for array based on line count.
     PRODUCT prodContainter[lineCount];
     ptr = (PRODUCT*)malloc(sizeof(PRODUCT)*lineCount);
     ptr = prodContainter;

     read(ptr);

      //print after adding to array via pointer from other
      //function. this was a test.

      for(i = 0; i < lineCount; i++)
      {
          printf("%s ", prodContainter[i].supType);
          printf("%s ", prodContainter[i].prodName);
          printf("%f ", prodContainter[i].wholePrice);
          printf("%d ", prodContainter[i].quantWhole);
          printf("%f ", prodContainter[i].retPrice);
          printf("%d\n\n", prodContainter[i].retProdQuantity);

      }

    return 0;
}



void read(PRODUCT *pointerToArr)
{

    // objective in this method is to read in data from the file, create an object for every line and
    // then use the pointer array to add those objects to prodConstainer up above.

       char supplyName[15];
       char productName[15];
       double wholeP = 0;
       int  quantityWhole = 0;
       double retailPrice = 0;
       int retailProductQuant = 0;

    while(fscanf(fr, "%s %s %lf %d %lf %d", supplyName, productName, &wholeP, &quantityWhole, &retailPrice, &retailProductQuant) == 6)
    {
        PRODUCT record;
        int i;

        strcpy(record.supType, supplyName);
        strcpy(record.prodName, productName);
        record.wholePrice = wholeP;
        record.quantWhole = quantityWhole;
        record.retPrice = retailPrice;
        record.retProdQuantity = retailProductQuant;

        for(i = 0; i < lineCount; i++)
        {
            pointerToArr[i] = record;
        }
    }

    fclose(fr);
}

1 个答案:

答案 0 :(得分:2)

你永远不会倒回文件,因此在计算行数后所有的读数都会失败。

你正在打印的内容正好在记忆中。

当然,有很多方法可以解决这个问题。

  1. 使用rewind()
  2. 来回放文件
  3. 关闭文件,让你的read()函数(其名称与POSIX标准函数碰撞)重新打开文件。这还涉及删除可怕的全局变量fr
  4. 重新构建,所以你永远不会计算行数,只需阅读并让ptr数组在必要时增长(参见realloc())。
  5. 此外,you should really avoid casting the return value of malloc() in C。这样:

    ptr = (PRODUCT*)malloc(sizeof(PRODUCT)*lineCount);
    

    最好写成:

    ptr = malloc(lineCount * sizeof *ptr);
    

    这消除了强制转换,并且在指向的类型值上使用sizeof 来自动计算要分配的正确字节数。