Я написал этот код на языке C в Windows и узнал, что он будет протестирован в Linux. В Windows он показывает правильный вывод, который мне нужен, считывает файл трассировки и печатает в файлеexecute.txt для всех событий. Но когда я запускаю тот же код на виртуальной машине Linux, он считывает только первые 10 событий. Я пытался понять, в чем проблема, но изо всех сил пытаюсь, сможет ли кто-нибудь помочь?
Я прикрепил код ниже и скриншоты вывода на и на Windows и вывод в Linux
вывод из vs в Windows
вывод из терминала Linux
Ниже приведен файл C и заголовок
#include
#include
#include
#include "interrupts.h"
// Mode set to user mode by default:
int mode = USER_MODE;
Event events[MAX_EVENTS];
char instructions[25][10];
char instruction[6];
int event_count = 0;
int current_time = 0;
int current_mode = USER_MODE; // Default Mode
FILE *log_file;
int i = 0;
int vector_table[25];
// Initializing an array to store the random durations of SYSCALL events:
int syscall_random_durations[3];
void read_trace_file(const char *filename) {
FILE *trace_file = fopen(filename, "r");
char line[100];
if (trace_file == NULL) {
printf("Error opening trace.txt\n");
exit(1);
}
// Looping through each line in the file:s
while (fgets(line, sizeof(line), trace_file)) {
char event[30];
int vector_number;
int duration;
// Parse the event type, vector table number (if applicable), and duration from the line
if (sscanf(line, "SYSCALL %d, %d", &vector_number, &duration) == 2) {
// Format the event type as "SYSCALL "
sprintf(event, "SYSCALL %d", vector_number);
// Store "vector number" and "duration" in the fields of the event struct
// COULD BE REPLACED WITH FUNCTION INSTEAD
events[event_count].vector_table_position = vector_number;
events[event_count].event_duration = duration;
} else if (sscanf(line, "END_IO %d, %d", &vector_number, &duration) == 2) {
sprintf(event, "END_IO %d", vector_number);
// Store "vector number" and "duration" in the fields of the event struct
// COULD BE REPLACED WITH FUNCTION INSTEAD
events[event_count].vector_table_position = vector_number;
events[event_count].event_duration = duration;
} else if (sscanf(line, "CPU, %d", &duration) == 1){
sprintf(event, "CPU", duration);
// Store only "duration"
events[event_count].event_duration = duration;
}
// Store event type and duration in the events array
strcpy(events[event_count].event_type, event);
events[event_count].event_duration = duration;
event_count++; // Increment the event count
}
fclose(trace_file);
}
void read_vector_table(const char *filename1) {
FILE *vector_table_file = fopen(filename1, "r");
char line[100];
int i = 0;
if (vector_table_file == NULL) {
printf("Error opening vector_table.txt\n");
exit(1);
}
while (fgets(instructions[i], sizeof(instructions[i]), vector_table_file) != NULL && i < 25) {
// Remove the newline character if present
instructions[i][strcspn(instructions[i], "\n")] = '\0';
i++;
}
fclose(vector_table_file);
// Print the strings to verify
for (int j = 0; j < i; j++) {
printf("VECTOR: %d: %s\n", j + 1, instructions[j]);
}
}
void print_events(void) {
for (int i=0; i
Подробнее здесь: [url]https://stackoverflow.com/questions/79037003/the-code-is-not-reading-the-input-file-on-linux[/url]
Я написал этот код на языке C в Windows и узнал, что он будет протестирован в Linux. В Windows он показывает правильный вывод, который мне нужен, считывает файл трассировки и печатает в файлеexecute.txt для всех событий. Но когда я запускаю тот же код на виртуальной машине Linux, он считывает только первые 10 событий. Я пытался понять, в чем проблема, но изо всех сил пытаюсь, сможет ли кто-нибудь помочь? Я прикрепил код ниже и скриншоты вывода на и на Windows и вывод в Linux вывод из vs в Windows вывод из терминала Linux Ниже приведен файл C и заголовок [code] #include #include #include #include "interrupts.h"
// Mode set to user mode by default: int mode = USER_MODE;
Event events[MAX_EVENTS]; char instructions[25][10]; char instruction[6]; int event_count = 0; int current_time = 0; int current_mode = USER_MODE; // Default Mode FILE *log_file; int i = 0; int vector_table[25]; // Initializing an array to store the random durations of SYSCALL events: int syscall_random_durations[3];
// Looping through each line in the file:s while (fgets(line, sizeof(line), trace_file)) { char event[30]; int vector_number; int duration;
// Parse the event type, vector table number (if applicable), and duration from the line if (sscanf(line, "SYSCALL %d, %d", &vector_number, &duration) == 2) { // Format the event type as "SYSCALL " sprintf(event, "SYSCALL %d", vector_number); // Store "vector number" and "duration" in the fields of the event struct // COULD BE REPLACED WITH FUNCTION INSTEAD events[event_count].vector_table_position = vector_number; events[event_count].event_duration = duration; } else if (sscanf(line, "END_IO %d, %d", &vector_number, &duration) == 2) { sprintf(event, "END_IO %d", vector_number); // Store "vector number" and "duration" in the fields of the event struct // COULD BE REPLACED WITH FUNCTION INSTEAD events[event_count].vector_table_position = vector_number; events[event_count].event_duration = duration; } else if (sscanf(line, "CPU, %d", &duration) == 1){ sprintf(event, "CPU", duration); // Store only "duration" events[event_count].event_duration = duration; }
// Store event type and duration in the events array strcpy(events[event_count].event_type, event); events[event_count].event_duration = duration;
event_count++; // Increment the event count }
fclose(trace_file); }
void read_vector_table(const char *filename1) { FILE *vector_table_file = fopen(filename1, "r"); char line[100]; int i = 0; if (vector_table_file == NULL) { printf("Error opening vector_table.txt\n"); exit(1); } while (fgets(instructions[i], sizeof(instructions[i]), vector_table_file) != NULL && i < 25) { // Remove the newline character if present instructions[i][strcspn(instructions[i], "\n")] = '\0'; i++; }
fclose(vector_table_file);
// Print the strings to verify for (int j = 0; j < i; j++) { printf("VECTOR: %d: %s\n", j + 1, instructions[j]); }