Как прочитать входной файл и сохранить целые числа в массив в C - PullRequest
0 голосов
/ 20 марта 2019

Я работаю на симуляторе CPU Scheduler в C, и у меня есть входной файл со следующим:

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

Я хотел бы сохранить числа в первом, втором и третьем столбцах вмассив отдельно следующим образом:

a1[0] = 1     a2[0] = 0     a3[0] = 10
a1[1] = 2     a2[1] = 0     a3[1] = 9
a1[2] = 3     a2[2] = 3     a3[2] = 5
a1[3] = 4     a2[3] = 7     a3[3] = 4
a1[4] = 5     a2[4] = 10    a3[4] = 6
a1[5] = 6     a2[5] = 10    a3[5] = 7  

У меня возникли проблемы с пониманием, как реализовать это с помощью реализации C.Мой текущий код выглядит следующим образом:

int pList[len], wtList[len], btList[len];

char *str[256];
char *token[30];

FILE *input;

input = fopen(argv[1], "r");

if (input == NULL) {
    printf("File not found. \n");
    exit(1);
}

while (fgets(str, sizeof str, input)) {
    if (sscanf(str, "%d %d %d", &pList, &wtList, &btList) == 3) { 
        totalJobs++;
    } else {
        printf("Input text is not in 3 column format. Please check. \n");
    }
}

fclose(input);

//printf("Scheduling algorithm: %s\n", argv[2]);
//printf("Total %d tasks are read from \"%s\". press 'enter' to start...\n", totalJobs, input);
//printf("==================================================================\n");
for (i = 0; i < 6; i++) {
    printf(pList[i]);
    printf(wtList[i]);
    printf(btList[i]);
}

В идеале я бы хотел абстрактную реализацию помещения этих чисел в массив, потому что входной файл должен иметь больше или меньше строк и все еще работать.Я извиняюсь, если мое форматирование выключено, поскольку я впервые использую переполнение стека.Заранее благодарим за помощь и, пожалуйста, дайте мне знать, если мой вопрос все еще неясен.

ОБНОВЛЕНИЕ 1: я внес следующие исправления, как указано, и теперь получаю ошибку Segmentation fault (Core dumped).Может быть потому, что у меня не было * перед массивами?

1 Ответ

0 голосов
/ 20 марта 2019

У вашего кода много проблем.

1) Ваши массивы не инициализированы, что является верным способом получения нечитаемого вывода и потенциально очень плохих ошибок.

2) Некоторые переменные в вашем коде не объявлены. В будущем, пожалуйста, опубликуйте код ТОЧНО, как и для вас, чтобы его можно было сразу скомпилировать. Испытанный и верный способ не получить никаких ответов на ваши вопросы - это опубликовать код, который необходимо существенно отредактировать, прежде чем он даже скомпилируется: люди обычно просто говорят: «Винт это, не стоит», и вы действительно не можете их винить.

3) Ваш способ чтения файлов неэффективен с точки зрения структуры кода с точки зрения производительности. Лучший способ чтения файлов - это прочитать их за один раз, а затем проанализировать, чтобы получить из них то, что вам нужно.

4) Ваши printfs в последнем цикле for абсолютно неверны, что странно, потому что в закомментированных printfs выше, а также в sscanf вы, похоже, понимаете, как работает форматная строка. Я думаю, что это ошибка не очень внимательно читать ваш код. Пожалуйста, сделайте это с этого момента.

Вот полная программа, которая, я думаю, примерно соответствует вашим требованиям:

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char** argv) {
    #define jobArrayLength (6ULL)
    #define stringLength   (256ULL)
    int  pList[jobArrayLength] = {0}, wtList[jobArrayLength] = {0}, btList[jobArrayLength] = {0};
    int  totalJobs = 0; // Used to not be declared
    char str[stringLength] = {0} ; // Used to be uninitialized

    FILE *input;
    input = fopen(argv[1], "r"); 
    if (input == NULL) {
        printf("File not found. \n");
        exit(1);
    }

    fread(str, 1, stringLength, input); // Used to be sizeof str which is wrong
    fclose(input);
    int i; // Used to not be declared
    int stringIndex = 0;
    for (i = 0; i < jobArrayLength; i++) {
        if (sscanf(str + stringIndex, "%d %d %d", pList + i, wtList + i, btList + i) == 3) { // used to not index into the array
            totalJobs++;
            while (str[stringIndex++] != '\n' && stringIndex != stringLength) {} // Skip to next row of numbers
        } else {
            printf("Input text is not in 3 column format. Please check. \n");
        }
    }

    //printf("Scheduling algorithm: %s\n", argv[2]);
    //printf("Total %d tasks are read from \"%s\". press 'enter' to start...\n", totalJobs, input);
    //printf("==================================================================\n");
    for (i = 0; i < jobArrayLength; i++) {
        printf("%d, %d, %d\n", pList[i], wtList[i], btList[i]); // Used to just print an int array element, which is not how printf works.
    }
    getchar();
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...