Code:
10-07-2007, 03:42 AM #9
Bokarinho
Registered User
Join Date: Jun 2007
Posts: 47 How to read the data from file into your structure, its a complicated way using fgets() and strings, someone else could happily use fscanf() but i just wanted to get some practise with tokens. Well thats the prog:
Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define BUFFER_SIZE 1024
#define OFFSET 3
typedef struct p_struct
{
int partNumber;
char description[128];
int quantityStock;
float unitPrice;
}PartStruct;
PartStruct* ReadFromFile(const char *filename, int *ptrPartSize)
{
if(filename == NULL)
return NULL;
else
{
FILE *file = fopen(filename , "r");
if(file == NULL)
{
fprintf(stderr, "Error in opening '%s' file.\n", filename);
return NULL;
}
else
{
//Index.
int i = 0;
int j = 0;
static int error = 0;
//Strtok pointer.
char *ptrTok = NULL;
//Array to hold the data from file.
char buffer[BUFFER_SIZE];
//Our array of structs.
PartStruct *ptrParts = NULL;
//Get init space.
ptrParts = calloc(1, sizeof(PartStruct));
if(ptrParts == NULL)
return NULL;
//Initialise buffer.
memset(buffer, 0 , BUFFER_SIZE);
while(1)
{
if(fgets(buffer, sizeof(buffer), file) == NULL)
break;
if(buffer[0] == '\n')
continue;
if(buffer[0] == '0')
break;
if(buffer[strlen(buffer)-1] == '\n')
buffer[strlen(buffer)-1] = '\0';
//Tokens.
ptrTok = strtok(buffer, " *");
if(ptrTok == NULL)
{
error = 1;
break;
}
else
{
if(sscanf(ptrTok,"%d",&ptrParts[i].partNumber) != 1)
{
error = 2;
break;
}
while(ptrTok != NULL && j < OFFSET)
{
ptrTok = strtok(NULL, " *");
switch(j)
{
case 0:
//Its a bit strange to use this technique only knowing the way the
//data stored in the file. <fscanf may become a better solution.>
strcpy(&ptrParts[i].description, ptrTok);
ptrTok = strtok(NULL, "*");
ptrParts[i].description[strlen(ptrParts[i].description)] = ' ';
strcat(&ptrParts[i].description, ptrTok);
break;
case 1:
sscanf(ptrTok,"%d",&ptrParts[i].quantityStock);
break;
case 2:
sscanf(ptrTok,"%f",&ptrParts[i].unitPrice);
break;
default:
printf("Error.\n");
error = 3;
break;
}
//Advance j.
j++;
}
}
//Should realloc here.
i++;
ptrParts = realloc(ptrParts, (i+1) * sizeof(PartStruct));
//Remember to get j to zero.
j = 0;
}
//Close file.
fclose(file);
//Return the struct.
if(!error)
{
*ptrPartSize = i;
return ptrParts;
}
else
{
free(ptrParts);
return NULL;
}
}
}
}
int main(int argc, char* argv[])
{
int i;
int r_size = 0;
PartStruct *r = ReadFromFile("parts.txt", &r_size);
for(i = 0; i < r_size; i++)
printf("%d %s %d %f\n", r[i].partNumber, r[i].description, r[i].quantityStock, r[i].unitPrice);
free(r);
printf("Hit any key to exit........");
getch();
return 0;
}
is that linked lists??i thought u needed stuff like "last->next" etc.can someone modify this proogram to use linked list instead ?
Code:
////RAJIV RAMKHALAWAN
//ID:806001754
//ASSIGNMENT 1
#include <stdio.h>
typedef struct
{
int partnum;
char desc[50];
int qtyInStock;
double unitPrice;
} part_info;
#define MAX 50
part_info part[MAX];
int main()
{
void readDesc(FILE * in, char data[]);
void AddInOrder(int i);
FILE * in = fopen("parts.dat","r");
if (in == NULL)
{
printf("File not found: parts.dat\n");
system("pause");
return 1;
}
int id, i=0, finished=0;
double TotalSales=0;
char trans[3];
fscanf(in,"%d",&id);
while (id != 0 && i<MAX)
{
part[i].partnum = id;
readDesc(in, part[i].desc);
fscanf(in,"%d",&part[i].qtyInStock);
fscanf(in,"%lf",&part[i].unitPrice);
if (i>0) AddInOrder(i);
i++;
fscanf(in,"%d",&id);
}
while (finished==0)
{
char ch=getc(in);
while (ch== ' ')
ch=getc(in);
trans[0]=getc(in);
if (trans[0] != EOF)
{
trans[1]=getc(in);
trans[2]='\0';
if (strcmp(trans,"ls")==0)
{
printf("\nPart No.\tDescription\t\tQuantity in Stock\tPrice\n\n");
int j;
for (j=0; j<i; j++)
printf("%d\t\t%-30s\t%d\t\t%5.2lf\n",part[j].partnum, part[j].desc, part[j].qtyInStock, part[j].unitPrice);
}
else
if (strcmp(trans,"sp")==0)
{
int j, pnum, qsold;
fscanf(in,"%d",&pnum);
fscanf(in,"%d",&qsold);
for (j=0; j<i; j++)
{
if (part[j].partnum > pnum)
{
printf("\nPart Number not found: %d!!!\n",pnum);
break;
}
else
if (part[j].partnum == pnum)
{
if (part[j].qtyInStock < qsold)
{
printf("\nNot enough quantity in stock!!!\n");
break;
}
else
{
part[j].qtyInStock-=qsold;
TotalSales+= (part[j].unitPrice * qsold);
break;
}
}
}
}
else
if (strcmp(trans,"ap")==0)
{
fscanf(in,"%d",&part[i].partnum);
readDesc(in, part[i].desc);
fscanf(in,"%d",&part[i].qtyInStock);
fscanf(in,"%lf",&part[i].unitPrice);
if (i>0) AddInOrder(i);
i++;
}
else
if (strcmp(trans,"cp")==0)
{
int j, pnum, nprc;
fscanf(in,"%d",&pnum);
fscanf(in,"%d",&nprc);
for (j=0; j<i; j++)
{
if (part[j].partnum > pnum)
{
printf("\nPart Number not found: %d....\n",pnum);
break;
}
else
if (part[j].partnum == pnum)
{
part[j].unitPrice=nprc;
break;
}
}
}
else
if (strcmp(trans,"cq")==0)
{
int j, pnum, qty;
fscanf(in,"%d",&pnum);
fscanf(in,"%d",&qty);
for (j=0; j<i; j++)
{
if (part[j].partnum > pnum)
{
printf("\nPart Number not found: %d....\n",pnum);
break;
}
else
if (part[j].partnum == pnum)
{
part[j].qtyInStock+=qty;
break;
}
}
}
}
else
finished=1;
}
printf("\nTotal Sales: %5.2lf\n",TotalSales);
getchar();
return 0;
}
/////////////////////////////..........................FUNCTION TO SORT
void AddInOrder(int i)
{
int j=i;
part_info temp;
while (j>=0 && (part[i].partnum < part[j-1].partnum))
{
temp=part[j];
part[j] = part[j-1];
part[j-1] = temp;
j--;
}
}
///////////////////////////..............................FUNCTION TO READ FILE
void readDesc(FILE * in, char data[])
{
char c;
int i=0;
c=getc(in);
while (c != '*') c=getc(in);
c=getc(in);
data[i]=c;
c=getc(in);
while (c != '*')
{
i++;
data[i]=c;
c=getc(in);
}
i++;
data[i]='\0';
}