C 中的文件打开问题

问题描述 投票:0回答:1

我正在用 C 语言编写优先级调度算法,但在打开文件时遇到一些问题。我的笔记本电脑是M1 macbook,我的编程环境是vscode。
这个程序在终端上可以工作,但是当我将它作为 Unix 可执行文件执行时,它就不起作用了。程序说该文件未打开。像这样:

File is not opened.
Input
---------------------------------------------------------
Process ID   Arrival Time    Burst Time  Priority
---------------------------------------------------------
zsh: segmentation fault  

Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

所以我在windows上编译了它,但这些代码仍然有问题:

// codes in FileOpen.c
*process = (Process*)malloc(sizeof(Process) * line);
    if (process == NULL) {
        fprintf(stderr, "Memory Allocation failure.\n");
        return -1;
    }

    while (fscanf(file, "%s %d %d %d %d", bin, &(*process)[i].processID, &(*process)[i].arrivalTime, &(*process)[i].burstTime, &(*process)[i].priority) != EOF) {
        i++;
    }


我使用文本文件进行输入。这是文本文件:

process 1 1 7 2
process 2 0 10 7
process 3 4 6 5
process 4 7 4 2

我希望这个程序动态读取文件,所以我想得到

line
,它保存了文本文件中的行数。它存在于 FileOpen.c 中。我像这样动态分配
process

*process = (Process*)malloc(sizeof(Process) * line);
    if (process == NULL) {
        fprintf(stderr, "Memory Allocation failure.\n");
        return -1;
    }

我不知道出了什么问题。我将不胜感激有人帮助我。谢谢。 这些是我认为必要的代码。

// Priority.h
#ifndef DATA_H_
#define DATA_H_

// Process Structure
typedef struct {
    int processID;
    int arrivalTime;
    int burstTime;
    int priority;
}Process;

// Result Structure
typedef struct {
    int processID;
    int burstTime;
    int waitingTime;
} ResultElement;


int OpenFile(const char* filename, Process *process[]); // File open
Process Initialize (Process* process, int i); // Intialize Queue
Process* ReadyQueueGenerator (int); // Generate Ready Queue
void ShowResult (ResultElement process); // Show Reulst
void SchedulingAlgorithm (Process process[], int); // Run Scheduling Algorithm
void Sort(Process process[], int); // Sort Process

#endif
// main.c
// Priority Scheduling Algorithm
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "Priority.h"

// Sort by Arrival Time
void Sort(Process process[], int numProcess) {
    Process temp;
    for (int i = 0; i < numProcess; i++) {
        for (int j = i+1; j < numProcess; j++) {
            if (process[i].arrivalTime > process[j].arrivalTime) {
                temp = process[i];
                process[i] = process[j];
                process[j] = temp;
            }
        }
    }
}

int main() {
    Process *process = NULL;
    int numProcess = OpenFile("scheduling.txt", &process);

    // List of process
    printf("Input\n");
    printf("---------------------------------------------------------\n");
    printf("Process ID\t Arrival Time\t Burst Time\t Priority\n");
    printf("---------------------------------------------------------\n");
    for (int i = 0; i < numProcess; i++) {
        printf("%2d\t\t %2d\t\t %2d\t\t %2d\n", process[i].processID, process[i].arrivalTime, process[i].burstTime, process[i].priority);
    }

    // Sort by Arrival Time
    Sort(process, numProcess);

    // Run Scheduling Algorithm
    SchedulingAlgorithm(process, numProcess);

    free(process);
    return 0;

    
}
// FileOpen.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "Priority.h"

// Open file function
int OpenFile(const char* filename, Process **process) {
    FILE *file;
    int line = 0;
    int i = 0;

    // Open file function
    file = fopen(filename, "r");
    if (file == NULL) {
        printf("File is not opened.\n");
        return -1;
    }

    char bin[20] = {0, };
    while (fgets(bin, sizeof(bin), file) != NULL) {
        line++;
    }

    fseek(file, 0, SEEK_SET);

    *process = (Process*)malloc(sizeof(Process) * line);
    if (process == NULL) {
        fprintf(stderr, "Memory Allocation failure.\n");
        return -1;
    }

    while (fscanf(file, "%s %d %d %d %d", bin, &(*process)[i].processID, &(*process)[i].arrivalTime, &(*process)[i].burstTime, &(*process)[i].priority) != EOF) {
        i++;
    }
    
    
    fclose(file);
    return line;
}

希望能解决这些问题

c macos file dynamic-memory-allocation
1个回答
0
投票
Process *process = NULL;
int numProcess = OpenFile("scheduling.txt", &process);

OpenFile()
可以返回-1表示失败,你没有检查。 由于
OpenFile()
未能打开文件,因此它返回,并且
process
仍将初始值设定项保留为空指针。

后续操作尝试取消引用

process
,而不是在
OpenFile()
失败时退出,这会调用未定义的行为,在这种情况下会导致分段错误。

© www.soinside.com 2019 - 2024. All rights reserved.