簡體   English   中英

將文件中的數據讀入結構

[英]Read data from file into structure

我正在開發一個可以處理鏈表/節點中的結構項的程序。 我的大多數函數都運行正常,但是我仍然堅持如何從txt文件讀取到一個結構(readFromFile函數)。 我一直在閱讀但仍然很困惑,主要是關於如何將其作為一個函數而不是在main中編寫,並且還讀入一個結構

任何幫助,將不勝感激。

編輯:我似乎無法在目前的答案中獲得功能,所以我正在嘗試從主要的txt中讀取程序。 我可以打開文件,但問題是:如何將數據讀入鏈表?

(代碼已被修改)

我正在讀取的文本文件格式如下:


#1 Flat Blade Screwdriver
12489
36
.65
1.75
#2 Flat Blade Screwdriver
12488
24
.70
1.85
#1 Phillips Screwdriver
12456
27
0.67
1.80
#2 Phillips Screwdriver
12455
17
0.81
2.00
Claw Hammer
03448
14
3.27
4.89
Tack Hammer
03442
9
3.55
5.27
Cross Cut Saw
07224
6
6.97
8.25
Rip Saw
07228
5
6.48
7.99
6" Adjustable Wrench
06526
11
3.21
4.50

我的計划到目前為止:

#include "stdafx.h"
#include <stdlib.h>

typedef struct inventory
{
    char invName[36];
    int  invPartNo;
    int  invQOH;
    float invUnitCost;
    float invPrice;
}stock;

struct  NODE
{
    union
    {
        int  nodeCounter;
        void  *dataitem;
    }item;
    struct NODE *link;
};

struct NODE *InitList();
void DisplayNode(struct inventory *);
struct inventory * ReadData(FILE *);
void DisplayList(struct NODE *);
struct NODE* GetNode(FILE *);
void  Add2List(struct NODE *, struct NODE *);
struct NODE* SearchList(struct NODE *, int );
void  DeleteNode(struct NODE *, int );


int main(int argc, char* argv[])
{
    struct NODE *header;
    header = InitList();

    char ch, file_name[25];
   FILE *fp;

   printf("Enter the name of file you wish to see\n");
   gets(file_name);

   fp = fopen(file_name,"r"); // read mode

   if( fp == NULL )
   {
      perror("Error while opening the file.\n");
      exit(EXIT_FAILURE);
   }

   printf("The contents of %s file are :\n", file_name);

   while( ( ch = fgetc(fp) ) != EOF )
   {
      //what to put here?
   }

   fclose(fp);
   DisplayList(header);



    return 0;
}

struct NODE *InitList()
{
    struct NODE *temp = (struct NODE*)malloc(sizeof NODE);

    temp->item.nodeCounter = 0;
    temp->link = NULL;
    return temp;
}


void  Add2List(struct NODE *start, struct NODE *NewNode)
{
    struct NODE *current = start;

    while (current->link != NULL)
        current = current->link;

    current->link = NewNode;
    NewNode->link = NULL;

    start->item.nodeCounter++;
}


struct NODE* GetNode(FILE *fptr)
{
    struct NODE *temp = (struct NODE*)malloc(sizeof NODE);

    temp->item.dataitem = ReadData(fptr);
    temp->link = NULL;

    return temp;
}


void DisplayList(struct NODE *start)
{
    struct NODE *current = start->link;

    while (current != NULL)
    {
        DisplayNode((struct inventory *)current->item.dataitem);
        current = current->link;

    }
}


void DisplayNode(struct inventory *stuff)
{
    /*
    char invName[36];
    int  invPartNo;
    int  invQOH;
    float invUnitCost;
    float invPrice;
    */

    printf("Name: %s", stuff->invName);
    printf("Part Number: %d", stuff->invPartNo);
    printf("Quantity on hand: %d", stuff->invQOH);
    printf("Unit Cost: %0.2f", stuff->invUnitCost);
    printf("Price %0.2f", stuff->invPrice);
}


struct inventory * ReadData(FILE *fptr)
{
    struct inventory *temp = (struct inventory *)malloc(sizeof inventory);

    if(fptr==stdin)
        printf("Enter item name: ");
    fscanf_s(fptr, "%s", temp->invName);
    if(fptr==stdin)
        printf("Enter item part number: ");
    fscanf_s(fptr, "%d", &temp->invPartNo);
    if(fptr==stdin)
        printf("Enter item quantity on hand: ");
    fscanf_s(fptr, "%d", &temp->invQOH);
    if(fptr==stdin)
        printf("Enter item unit cost: ");
    fscanf_s(fptr, "%f", &temp->invUnitCost);
    if(fptr==stdin)
        printf("Enter item price: ");
    fscanf_s(fptr, "%f", &temp->invPrice);

    return temp;
}

struct NODE* SearchList(struct NODE *start, int oldData)
{
    struct NODE* current = start;
    struct inventory * st = (struct inventory *)current->link->item.dataitem;

    while (st->invPartNo != oldData && current != NULL)
    {
        current = current->link;
        if(current->link)
            st = (struct inventory *)current->link->item.dataitem;
    }
    return current;
}

void  DeleteNode(struct NODE *start, int oldData)
{
    struct NODE *current, *oldNode;

    current = SearchList( start, oldData);
    oldNode = current->link;
    current->link = oldNode->link;
    free(oldNode);
    start->item.nodeCounter -= 1;
}

您可以使用fscanf()fgets()來讀取數據,

void readFromFile( )
{
   stock array[20];
   int i,j;
   i=0;
   fp = fopen("input.txt", "r");
   if( fp != NULL ){
      while ( !feof(fp ) ){
         fgets(array[i].invName,sizeof array[i].invName,fp);
         fscanf(fp,"%d %d %f %f ",&array[i].invPartNo,&array[i].invQOH,&array[i].invUnitCost,&array[i].invPrice);
         i++;
      }
}

array[]將擁有數據, i將讀取結構數據的數量。
這里fscanf()中的所有空格都跳過[enter]字符,因為數據在不同的行中。
閱讀fscanf()及其格式匹配和fgets()它可以幫助讀取文件。
為了避免feof()可以使用,

while (fgets(array[i].invName,sizeof array[i].invName,fp)) {
  fscanf(fp,"%d %d %f %f ",&array[i].invPartNo,&array[i].invQOH,&array[i].invUnitCost,&array[i].invPrice);
         i++;   
}

對於此特定文件格式。

算法:

  1. 以“文本”“讀取”模式打開文本文件。
  2. 如果您事先知道項目數,則創建一個stock結構數組,否則使用每個類型stock節點的鏈接列表。
  3. 要從文件讀取數據到相應的字段,您可以使用fscanf
  4. 當您認為已完成數據讀取時,請關閉該文件。

筆記:

  1. 文件指針會自動遞增,因此您無需擔心增加它以讀取下一組數據。
  2. 別忘了關閉文件。
  3. 要檢查文件處理函數是否正常工作,請檢查所有函數的返回值。

重要:

由於文件中的invPartNo字段具有以0開頭的整數數據,因此您可能不希望將其讀作整數,否則將其視為“八進制數”而不是十進制數。

您的_tmain可能如下所示,此代碼假定文件中的內容已完成(即包含正確的行數):

int _tmain(int argc, _TCHAR* argv[])
{   struct NODE *header = InitList();
    if (argc > 1)
    {   FILE *f;
        if ((f = fopen(argv[1], "rt") == NULL)
        {   printf(_T("Could not open file %s\n"), argv[1]);
            return 1;
        }
        while (!feof(f))
            Add2List(header, GetNode(f));
        fclose(f);
    }
    else
    {   int  PCounter = 2;
        while (PCounter--)
            Add2List(header,GetNode(stdin));
    }

    DisplayList(header);

    return 0;
}

編輯 :從命令提示符運行程序並將文件名作為參數傳遞

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM