我正在用 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;
}
希望能解决这些问题
Process *process = NULL;
int numProcess = OpenFile("scheduling.txt", &process);
OpenFile()
可以返回-1表示失败,你没有检查。
由于 OpenFile()
未能打开文件,因此它返回,并且 process
仍将初始值设定项保留为空指针。
后续操作尝试取消引用
process
,而不是在 OpenFile()
失败时退出,这会调用未定义的行为,在这种情况下会导致分段错误。