Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
377 views
in Technique[技术] by (71.8m points)

Processing Input file in c

So Im just wondering about a few tips on doing a scheduler simulation.

So far, I just want to input a file at the command line i.e. /.scheduler in.file

The in.file holds the following information:

./Job1.txt
./Job2.txt
./Job3.txt
./Job4.txt

Each Job .txt file has random lines of code. With only the first line being significant. The first line is starting 'tick' time.

Job A:

10
1fi
3sdkfj
4ksdkk
5kdkfk
6kdkjf
7dkjkfd
9dkkf
10dku

At the moment I just want to take the in.file and order the 'Job' files in order of their arrival tick time i.e. first line.

My code thus far:

#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>


#include "projscheduler.h"



/* I/O Files */
//static char *inputFile;
char * in;
static FILE *input;

/*Scheduled jobs indexed by PID*/
struct job list[20];

/* the next job to schedule */
//static struct job *job_next = NULL;

/* Time */
time clock;

/*Initialises job list*/
static void initialise_list(void) {
    for(int i = 0; i < sizeof(list)/sizeof(list[0]); i++) {
        list[i].parameters.pid = -1;
    }
}

/** Read and parse input from input file */
static void parse_input(void) 
{
    char    buffer[BUFSIZ];
    //int   jobs;



    initialise_list();



    while( fgets(buffer, sizeof(buffer), input) )   
    {
        pid j_pid;
        sscanf(buffer, "./%d.txt", &j_pid);

    } 

}   


int main(int argc, char **argv) 
{

    if ( (input = fopen(in, "r")) == NULL ) {
        fprintf(stderr, "cannot open %s
", argv[1]);
    }

    parse_input(); 


    return EXIT_SUCCESS;
}

HEADER FILE:

/**
 * Simulation of a process scheduler
*/

//#ifndef SCHEDULER_H_
#define SCHEDULER_H_

#include <stddef.h>


/* types */
/** units of time */
typedef long time;
/** process identifier */
typedef int pid;

/** Information about a job of interest to the task scheduler */
struct job_data {

/* pid of this process */
    pid pid;
    /* time process starts */
    time start;
    /* time needed to finish */
    time finish;
    /* time spent processing so far */
    time scheduled;
    /* size of the process */
    size_t size;

};

struct job {

    /* Various parameters used by the scheduler */
    char job_name[BUFSIZ];
    struct job_data parameters;
    /* next job to be scheduled */
    //struct job *next;


};
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I am unsure what problems you are having exactly but I can see the following errors in the code:

  • In the initialise_list() function the for loop will be iterating too many times and going beyond the bounds the of array:

    for(int i = 0; i < sizeof(list); i++) {
    

as sizeof(list) will return the number of bytes occupied by the array which is 20 * sizeof(struct job). Change to:

    for(int i = 0; i < sizeof(list) / sizeof(list[0]); i++) {
  • this is a missing left parenthesis from fopen() attempt (meaning the posted code does not compile):

    if( (input = fopen(inputfile, "r") == NULL )
    

should be:

    if( (input = fopen(inputfile, "r")) == NULL )
  • proj is an initialised char* and this will mostly likely cause a segmentation fault:

    char *proj;
    sscanf(buffer, "./%s.txt", proj);
    

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...