-3

I'm new on the subject of data structures so forgive me if Im asking a stupid question, I've been trying to figure this out myself but got nowhere.

These are the functions I'm working on and I think I initialized the file properly. However I couldn't understand why the function GetString prints an infinite loop of spaces. I have another function that exported some data on the said file. When i deleted the ImportListOfCompanyData function everything seems in order and the file is exported as it should be. However when ImportListOfCompanyData is there, the file is NULL.


void char * GetString(FILE *fp)
{
    char c;

    while(c != '\n')
    {
        c = fgetc(fp);
        printf("%c", c);
    }

}

void ImportListOfCompanyData(char *FileName, struct CompanyType s[], int maxit1, int maxit2)
{
    FILE * fp;

    char c;

    fp = fopen(FileName, "r");

    if (fp==NULL)
    {
        printf("Error creating the file \n");
        exit(1);
    }

    GetString(fp);

    fclose(fp);

}

Someone asked for the complete code: It's bit long sorry!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXNUM 100

struct Department
{
    char DepName[MAXNUM];
    int NuEmp;
    double Budget;
    int dflag;
};

typedef struct Department DEP;

struct CompanyType
{
    char CompName[MAXNUM];
    char OwnerName[MAXNUM];
    int Year;
    double StockPrice;
    int flag;
    DEP Dep[MAXNUM];
};

struct ImpDepartment
{
    char IDepName[MAXNUM];
    int INuEmp;
    double IBudget;
    int Idflag;
};

typedef struct ImpDepartment IDEP;

struct ImpCompanyType
{
    char ICompName[MAXNUM];
    char IOwnerName[MAXNUM];
    int IYear;
    double IStockPrice;
    int Iflag;
    IDEP IDep[MAXNUM];
};

void CreateCompany(struct CompanyType s[], char * cname, char * cowner, int year, double sprice, int i)
{

    strcpy(s[i].CompName, cname);
    strcpy(s[i].OwnerName, cowner);

    s[i].Year = year;
    s[i].StockPrice = sprice;
    s[i].flag = 0;
}

int PrintCompany(struct CompanyType s[], int maxit1, int maxit2)
{
    int flag = 0, i = 0;

    while(i <= maxit1)
    {
        if(s[i].flag == 1)
        {
            flag = 1;
            break;
        }
        printf("%d. Company %s: \n\n", i + 1, s[i].CompName);
        printf("****************\n");
        printf("Owned by: %s\n", s[i].OwnerName);
        printf("Establishment year: %d\n", s[i].Year);
        printf("Stock price: %.2lf\n", s[i].StockPrice);
        printf("****************\n\n");

        int j = 0;
        while(j < maxit2)
        {
            if(s[i].Dep[j].dflag == 1)
            {
                flag = 1;
                break;
            }
            printf("****************\n");
            printf("%d. Department %s: \n", j + 1, s[i].Dep[j].DepName);
            printf("Number of employees: %d\n", s[i].Dep[j].NuEmp);
            printf("Budget: %.2lf\n", s[i].Dep[j].Budget);
            printf("****************\n\n");
            j++;
        }
        i++;
    }
    if(flag == 1)
        return -1;

    else
        return 0;

}

int CompareName(char * str1, char * str2)
{
    char *stra, *strb;
    int result;

    result = strcmp(str2, str1);

    return result;

}

void DeleteCompany(struct CompanyType s[], char * cname, int n)
{
    int i = 0, check = 0;

    while(i <= n)
    {
        if(CompareName(s[i].CompName, cname)== 0)
        {
            check = 1;
            break;
        }
        i++;
    }
    if(check == 1)
    {
        s[i].flag = 1;
        printf("Company %s was successfully deleted!\n", s[i].CompName);
    }

    else
        printf("The input is wrong!");

}

void UnDeleteCompany(struct CompanyType s[], char * cname, int n)
{
    int i = 0, check = 0;

    while(i <= n)
    {
        if(CompareName(s[i].CompName, cname)== 0)
        {
            check = 1;
            break;
        }
        i++;
    }
    if(check == 1)
    {
        if(s[i].flag == 0)
        {
            printf("The Company %s wasn't deleted in the first place.\n\n", s[i].CompName);
        }
        else
        {
            s[i].flag = 0;
            printf("Company %s was successfully undeleted!\n\n", s[i].CompName);
        }
    }

    else
        printf("The input is wrong!");
}
int SearchForCompany(struct CompanyType s[], char * cname, int maxit, int a)
{
    int i = 0;
    int check = 0;
    int m = 0;

    while(i <= maxit)
    {
        if(CompareName(s[i].CompName, cname)== 0)
        {
            check = 1;
            break;
        }
        i++;
    }
    if(check == 1)
    {
        if(s[i].flag == 1)
        {
            printf("The company ""%s"" doesn't exist\n\n", cname);
        }
        else
        {

            if(a == 1)
            {
                printf("The company %s was found!", s[i].CompName, s[i].CompName);
                m = 1;
            }
            else
                m = 1;
        }
    }
    else
        printf("The company ""%s"" doesn't exist\n\n", cname);

    if (m == 1)
        return i;

    else
        return -1;

}



void AddDeparments(struct CompanyType s[], char * cname, int maxit, int a, char * dname, int nem, double bud, int depno)
{
    int n;
    n = SearchForCompany(s,cname, maxit, a);

    if(maxit == -1)
        return -1;

    strcpy(s[n].Dep[depno].DepName, dname);

    s[n].Dep[depno].NuEmp = nem;

    s[n].Dep[depno].Budget = bud;

    s[n].Dep[depno].dflag = 0;

   printf("The department %s was created in the %s company\n",s[n].Dep[depno].DepName, s[n].CompName);

}

int SearchForDepartments(struct CompanyType s[], char * dname, int maxit1, int maxit2, int a, int *succ, int *i, int*j)
{
    int check = 0;

    while((*j) <= maxit1)
    {
        while((*i) <= maxit2)
        {
            if(CompareName(s[(*i)].Dep[(*j)].DepName, dname)== 0)
            {
                check = 1;
                break;
            }
            (*i)++;
        }

        if(check == 1)
            break;
        (*j)++;
    }
    if(check == 1)
    {
        if(s[(*i)].Dep[(*j)].dflag == 1)
        {
            printf("The department ""%s"" doesn't exist.\n\n", dname);
        }
        else
            (*succ) = 1;

    }
    else
        printf("The department ""%s"" doesn't exist\n\n", dname);

    if ((*succ) == 1)
        return 0;

    else
        return -1;

}

int SearchForDelDepartments(struct CompanyType s[], char * dname, int maxit1, int maxit2, int a, int *succ, int *i, int*j)
{
    int check = 0;

    while((*j) <= maxit1)
    {
        while((*i) <= maxit2)
        {
            if(CompareName(s[(*i)].Dep[(*j)].DepName, dname)== 0)
            {
                check = 1;
                break;
            }
            (*i)++;
        }

        if(check == 1)
            break;
        (*j)++;
    }
    if(check == 1)
    {
        if(s[(*i)].Dep[(*j)].dflag == 1)
        {
            (*succ) = 1;
        }

    }
    else
        printf("The department ""%s"" doesn't exist\n\n", dname);

    if ((*succ) == 1)
        return 0;

    else
        return -1;

}

void DeleteDepartments(struct CompanyType s[], int maxit1, int maxit2, int a, char * dname)
{
    int n, i = 0, j = 0;
    int succ = 0;
    n = SearchForDepartments(s, dname, maxit1, maxit2, a, &succ, &i, &j);

    if(n == -1)
        return -1;

    if(succ == 1)
    {
        s[i].Dep[j].dflag = 1;
        printf("The department %s was deleted from the %s company\n", dname, s[i].CompName);
    }

}

void UnDeleteDepartments(struct CompanyType s[], int maxit1, int maxit2, int a, char * dname)
{
    int n, i = 0, j = 0;
    int succ = 0;
    n = SearchForDelDepartments(s, dname, maxit1, maxit2, a, &succ, &i, &j);

    if(n == -1)
        return -1;

    if(succ == 1)
        s[i].Dep[j].dflag = 0;

    if(s[i].Dep[j].dflag == 0)
        printf("The department %s was undeleted\n", dname);

}

ExportListOfCompanyData(struct CompanyType s[], int maxit1, int maxit2, char * FileName)
{
    FILE *fp;

    fp = fopen(FileName, "w");

    if (fp==NULL)
    {
        printf("Error creating the file \n");
        return -1;
    }

    int flag = 0, i = 0;

    while(i <= maxit1)
    {
        if(s[i].flag == 1)
        {
            flag = 1;
            break;
        }
        fprintf(fp,"%s\n", s[i].CompName);
        fprintf(fp,"%s\n", s[i].OwnerName);
        fprintf(fp,"%d\n", s[i].Year);
        fprintf(fp,"%.2lf\n\n", s[i].StockPrice);

        int j = 0;
        while(j < maxit2)
        {
            if(s[i].Dep[j].dflag == 1)
            {
                flag = 1;
                break;
            }
            fprintf(fp,"%s\n", s[i].Dep[j].DepName);
            fprintf(fp,"%d\n", s[i].Dep[j].NuEmp);
            fprintf(fp,"%.2lf\n\n", s[i].Dep[j].Budget);
            j++;
        }
        i++;
    }
    if(flag == 1)
        return -1;

    else
        return 0;

    fclose(fp);

}

char * GetString(FILE *fp)
{
    char * str; char c;
    str = (char *)malloc(sizeof(char)* MAXNUM);

    while(c != '\n')
    {
        c = fgetc(fp);
        printf("%c", c);
    }

}

ImportListOfCompanyData(char *FileName, struct CompanyType s[], int maxit1, int maxit2)
{
    FILE * fp;

    char c, *str;

    str = (char *)malloc(sizeof(char)* MAXNUM);

    fp = fopen(FileName, "r");

    if (fp==NULL)
    {
        printf("Error creating the file \n");
        exit(1);
    }

    int i = 0, j = 0, n;

    GetString(fp);

    fclose(fp);
    return 0;

}

int main()
{
    struct CompanyType CompanyList[MAXNUM];

    CreateCompany(CompanyList, "alara inc", "alara", 2020, 6969, 0);

    CreateCompany(CompanyList, "Shah inc", "shah", 2020, 3245, 1);

    DeleteCompany(CompanyList, "Shah inc", 1);

    SearchForCompany(CompanyList, "Shah inc", 1, 1);

    UnDeleteCompany(CompanyList, "Shah inc", 1);

    SearchForCompany(CompanyList, "Shah inc", 1, 1);

    SearchForCompany(CompanyList, "alara inc", 1, 1);

    AddDeparments(CompanyList, "alara inc", 1, 0, "computer", 20, 300, 0);

    AddDeparments(CompanyList, "Shah inc", 1, 0, "chemistry", 30, 450, 0);

    DeleteDepartments(CompanyList, 0, 1, 0, "chemistry");

    UnDeleteDepartments(CompanyList, 0, 1, 0, "computer");

    PrintCompany(CompanyList, 1, 1);

    UnDeleteDepartments(CompanyList, 0, 1, 0, "chemistry");

    ExportListOfCompanyData(CompanyList, 1, 1, "Data.txt");

    ImportListOfCompanyData("Data.txt", CompanyList, 1, 1);

    PrintCompany(CompanyList, 1, 1);

    return 0;

}```
  • 3
    What happens if the file ends before a newline is seen? – Nate Eldredge Sep 23 '20 at 02:58
  • I can't understand the description of the problem. Please show one or more *complete* examples of the code, enough that someone else can copy and paste it, compile, run and observe the problem. For each, explain what happens, and how that is different from what you expect to happen. It is also helpful to indicate the contents of the file that causes the problem. – Karl Knechtel Sep 23 '20 at 02:58
  • Also, assigning the return value of `fgetc` to a `char` is always wrong. See https://stackoverflow.com/questions/35356322/difference-between-int-and-char-in-getchar-fgetc-and-putchar-fputc/35356684#35356684 – Nate Eldredge Sep 23 '20 at 02:59
  • @KarlKnechtel i edited it now. Thank you – Yıldız Alara Köymen Sep 23 '20 at 03:06

1 Answers1

0

It was a really easy solution. I replaced "w" and "r" with "a+"

I guess it was a stupid question, still learning!