简体   繁体   中英

Reading in a text file in C, separate lines into multiple variables

I'm currently working on a program that simulates various CPU scheduling methods. Currently I have the program asking for input:

printf("Enter type of CPU scheduling algorithm (SJF, RR, PR_noPREMP, PR_withPREMP): ");
scanf("%s", typeOf);

printf("Enter number of processes: ");
scanf("%d", &numPro);

struct processStruct structs[numPro];
int burstTimes[numPro];

for (i = 0; i < numPro; i++) {
    printf("Enter process number: ");
    scanf("%d", &structs[i].pNum);
    printf("Enter arrival time: ");
    scanf("%d", &structs[i].arTime);        
    printf("Enter CPU burst time: ");
    scanf("%d", &structs[i].cpuBur);        
    printf("Enter priority: ");
    scanf("%d", &structs[i].prio);
}

In addition to the two variables typeOf (an int) and numPro (a char array) I am also using a data structure.

Here is the data structure that is holding the various parameters:

struct processStruct {
    int pNum;
    int arTime;
    int cpuBur;
    int prio;
    int waitTim;
};

Instead of manual input I could like to use a text file with the same information as input for the program. The text file would look something like this:

SJF
4
1 0 6 1
2 0 8 1
3 0 7 1
4 0 3 1

First line is the name of the scheduling algorithm. Second line is the number of processes. The following lines consists of information for each process. So 1 0 6 1 = Process = 1, 0 = Arrival Time, 6 = CPU burst time, 1 = Priority

I unfortunately have little experience using text file input with C. Does anyone have ideas about how I could read in the data from the text file into the variables and data structure?

Thank you

Edit: One of the issues I am having is that the data is not the same for each line. If it was just the rows of 4 numbers then it would be relatively easy. I need the program to read the first line into a char array (string), the second into the numPro variable then the subsequent lines into multiple instances of the data structure (one for each process).

You will want to use fscanf and fprintf instead of scanf and printf to do I/O from/to files instead of standard input/output.

These are widely documented. You will use FILE * variables and fopen & fclose . You can even use stdin , stdout , and stderr as handles for the console.

The file can be read fairly simply with fscanf() because everything except the first line identifier is a number. But you do need to check the validity of what is read from the file. I have just used exit(1) on error for illustration, it could be more sophisticated than that (for example an error message).

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

#define MAX 100

struct processStruct {
    int pNum;
    int arTime;
    int cpuBur;
    int prio;
    int waitTim;
};

struct processStruct structs[MAX];

int main(int argc, char** args)
{ 
    FILE *fil;
    char typeOf[4];
    int numPro, i;
    if ((fil = fopen("myfile.txt", "rt")) == NULL)
        exit(1);
    if(fscanf(fil, "%4s", typeOf) != 1)
        exit(1);
    if(fscanf(fil, "%d", &numPro) != 1)
        exit(1);
    if(numPro > MAX)
        exit(1);
    for(i=0; i<numPro; i++) {
        if(fscanf(fil, "%d%d%d%d", &structs[i].pNum, &structs[i].arTime,
                                   &structs[i].cpuBur, &structs[i].prio) != 4)
            exit(1);
    }
    fclose(fil);

    // test the result
    printf("Type: %s\n", typeOf);
    printf("Num: %d\n", numPro);
    for(i=0; i<numPro; i++) {
        printf("%d %d %d %d\n", structs[i].pNum, structs[i].arTime,
                                structs[i].cpuBur, structs[i].prio);
    }
    return 0;
}

Program output:

Type: SJF
Num: 4
1 0 6 1
2 0 8 1
3 0 7 1
4 0 3 1

The best way to read lines in a file with C is to use the getline() function. It is much more reliable than scanf() and can allocate the needed memory automagically.

Here is the code I suggest:

#define _POSIX_C_SOURCE 200809L

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

int main (int argc, char **argv)
{
  FILE *inputfile;

  if (argc < 2)
    {
      fprintf (stderr, "error: missing file name in the arguments\n");
      exit (EXIT_FAILURE);
    }

  inputfile = fopen (argv[1], "r");
  if (!inputfile)
    {
      perror ("myprogram");
      exit (EXIT_FAILURE);
    }

  /* Getting first line */
  char *line = NULL;
  size_t line_size = 0;

  if (!getline(&line, &line_size, inputfile))
    {
      fprintf (stderr, "error: failed to read first line\n");
      exit (EXIT_FAILURE);
    }

  /* Getting the size of the matrix */
  unsigned int size;   /* Size of the matrix */

  if (sscanf (line, "%zd", &size) != 1)
    {
      fprintf (stderr, "error: first line has wrong format\n");
      exit (EXIT_FAILURE);
    }

  /* Getting the content of the matrix */
  int matrix[size][size];

  for (unsigned int i = 0; i < size; i++)
    {
      if (!getline (&line, &line_size, inputfile))
        {
          fprintf (stderr, "error: input file has wrong format\n");
          exit (EXIT_FAILURE);
        }

      /* Copying the items of the line to the matrix */
      char *ptr = line;
      for (unsigned j = 0; j < size; j++)
        {
          matrix[i][j] = atoi(strtok(ptr, " "));
          ptr = NULL;
        }
    }

  free(line);

  return EXIT_SUCCESS;
}

Beware, I didn't tried this code... So, if something is not working properly, I'll fix it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM