How to read a file?

How read names from a file add one and sort them in alphabetical order in C programming?

  • I will need to check how many employees are on the old roster. For each employee, I will need to check to see if the NEW employee’s name should be printed before it. If so, print the new employee’s name, followed by the old employee. Otherwise, simply print the old employee’s name. This should repeat until all the names (new and old) have been printed to the new roster. This is what I have so far: #include <stdio.h> #include <string.h> struct record{ char fname[20]; char lname[20]; }; int namecmp (struct record eA, struct record eB); int main() { FILE *ifp = fopen("input.txt", "r"); FILE *ofp = fopen("roster.txt", "w"); int num_people, i, flag=0; struct record new_employee, temp_employee; //-Ask the user for the first and last names of the new employee printf("What is the first name of the new employee?\n"); scanf("%s", new_employee.fname); printf("What is the last name of the new employee?\n"); scanf("%s", new_employee.lname); //-Get the number of employees on the roster from the input file fscanf(ifp, "%d", &num_people); for(i = 0; i < num_people; i++){ fscanf(ifp, "%s", temp_employee.lname); fscanf(ifp, "%s", temp_employee.fname); namecmp(temp_employee, new_employee); } //-Set up a loop for the number of employees //-Each time you should do the following: //--Read in a name from the input file //--Use the provided namecmp function to see if the // new employee should be printed first //--Print the old employee to the output file //-If the new employee was never printed, print at the end of the file fclose(ifp); fclose(ofp); return 0; } /* Pre-Conditions: This function takes in two structures of type record. * These are labeled eA and eB for employee A and employee B, respectively. * Post-Conditions: This function compares the names of the two * employee to see which should come first lexicographically. * The function returns -1 if eA comes first, 1 if eB comes first, * and 0 if the employees have the same name. */ int namecmp (struct record eA, struct record eB) { if (strcmp(eA.lname, eB.lname) < 0) return -1; else if (strcmp(eA.lname, eB.lname) > 0) return 1; else { if (strcmp(eA.fname, eB.fname) < 0) return -1; else if (strcmp(eA.fname, eB.fname) > 0) return 1; else return 0; } }

  • Answer:

    Pass in a pointer rather than an entire structure. int namecmp(const struct record *a, const struct record *b) {         int r;         if ((r = strcmp(a->lname, b->lname)) != 0)                 return r;         return strcmp(a->fname, b->fname); } EDIT: Some other issues: Don't use the "%s" conversion specifier without a maximum field width. eg. Use "%19s" or a safer function like fgets. Check the return value of scanf. Always check the return value of fopen. It will return a null pointer if the stream cannot be opened. Advice: Check the return value of fclose on writes. Use the "static" keyword on functions/variables with file scope that aren't used outside of the translation unit. (This excludes main but includes namecmp.) EDIT#2: Oh, and don't read the book recommended by pramod. The author is a horrible programmer. Consider reading "The C Programming Language (Second Edition)" by Kernighan and Ritchie, as well as the standard specifications for the language.

Bruno P at Yahoo! Answers Visit the source

Was this solution helpful to you?

Other answers

Firstly you can read the programming language in C (Let Us C by YASHAVANT KANE TKAR) then you can do it. This programming code is your solution please see it....... #include <stdio.h> #include <string.h> struct record{ char fname[20]; char lname[20]; }; int namecmp (struct record eA, struct record eB); int main() { FILE *ifp = fopen("input.txt", "r"); FILE *ofp = fopen("roster.txt", "w"); int num_people, i, flag=0; struct record new_employee, temp_employee; //-Ask the user for the first and last names of the new employee printf("What is the first name of the new employee?\n"); scanf("%s", new_employee.fname); printf("What is the last name of the new employee?\n"); scanf("%s", new_employee.lname); //-Get the number of employees on the roster from the input file fscanf(ifp, "%d", &num_people); for(i = 0; i < num_people; i++){ fscanf(ifp, "%s", temp_employee.lname); fscanf(ifp, "%s", temp_employee.fname); namecmp(temp_employee, new_employee); } //-Set up a loop for the number of employees //-Each time you should do the following: //--Read in a name from the input file //--Use the provided namecmp function to see if the // new employee should be printed first //--Print the old employee to the output file //-If the new employee was never printed, print at the end of the file fclose(ifp); fclose(ofp); return 0; } /* Pre-Conditions: This function takes in two structures of type record. * These are labeled eA and eB for employee A and employee B, respectively. * Post-Conditions: This function compares the names of the two * employee to see which should come first lexicographically. * The function returns -1 if eA comes first, 1 if eB comes first, * and 0 if the employees have the same name. */ int namecmp (struct record eA, struct record eB) { if (strcmp(eA.lname, eB.lname) < 0) return -1; else if (strcmp(eA.lname, eB.lname) > 0) return 1; else { if (strcmp(eA.fname, eB.fname) < 0) return -1; else if (strcmp(eA.fname, eB.fname) > 0) return 1; else return 0; } }

pramod

Related Q & A:

Just Added Q & A:

Find solution

For every problem there is a solution! Proved by Solucija.

  • Got an issue and looking for advice?

  • Ask Solucija to search every corner of the Web for help.

  • Get workable solutions and helpful tips in a moment.

Just ask Solucija about an issue you face and immediately get a list of ready solutions, answers and tips from other Internet users. We always provide the most suitable and complete answer to your question at the top, along with a few good alternatives below.