Reading in a text file in C, separate lines into m

2019-02-27 19:28发布

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).

3条回答
时光不老,我们不散
2楼-- · 2019-02-27 19:41

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.

查看更多
劳资没心,怎么记你
3楼-- · 2019-02-27 19:47

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
查看更多
Fickle 薄情
4楼-- · 2019-02-27 19:55

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.

查看更多
登录 后发表回答