Сохраните данные из столбцов текстового файла в массив. в до

У меня есть текстовый файл, который выглядит так:

Process Priority    Burst   Arrival
1   8   15  0
2   3   20  0
3   4   20  20
4   4   20  25
5   5   5   45
6   5   15  55
7   9   10  70
8   6   15  100
9   5   15  105
10  5   15  115

Столбцы разделены вкладками. Мне нужно проигнорировать первую строку, а затем все записи из одного столбца сохранить их в массив, такой как int process[10].

Я нашел эту тему: Чтение в определенном столбце данных из текстового файла в C , однако то, как это делается, очень специфично для того, как данные настроены в вопросе оператора.

Спасибо.


person Community    schedule 30.11.2020    source источник


Ответы (2)


Попробуйте это. Это захватывает все столбцы, которые у вас есть из файла, и соответствует ansi:

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

void parseLine(char *line, int *num1, int *num2, int *num3, int *num4 ){

    char* temp;

    temp = strchr(line,'\t');
    temp[0] = '\0';
    *num1 = atoi(line);
    line = temp + 1;

    temp = strchr(line, '\t');
    temp[0] = '\0';
    *num2 = atoi(line);
    line = temp + 1;

    temp = strchr(line, '\t');
    temp[0] = '\0';
    *num3 = atoi(line);
    line = temp + 1;

    *num4 = atoi(line);
}

int main(void)
{
    FILE* fp;
    char line[100];
    
    int process[10];
    int priority[10];
    int burst[10];
    int arrival[10];
    int i;
    int j;

    i = 0;

    if ((fp = fopen("./yourfile.txt", "r")) == NULL)
    {
        printf("Error Opening File\n");
        exit(1);
    }

    fgets(line, sizeof(line), fp);


    while (fgets(line, sizeof(line), fp))
    {
        parseLine(line, &process[i],&priority[i],&burst[i],&arrival[i]);
        i++;
    }

    for (j = 0; j < 10; j++){
        printf("Process: %d, Priority: %d, Burst: %d, Arrival: %d\n", process[j], priority[j], burst[j], arrival[j]);
    }

    fclose(fp);
    return 0;
}
person Evan Vrkljan    schedule 30.11.2020
comment
Мое плохое, было своего рода быстрое кодирование, которое не осознавало тонкую ошибку, спасибо, что указали на это. - person Evan Vrkljan; 30.11.2020
comment
извините, я этого не видел, спасибо, это определенно соответствует остальной части моего кода. - person ; 30.11.2020

Сначала заметка об этом, это не полное решение, но я думаю, что оно поможет вам в разборе файла. Также вместо

сохранить их в массив, например int process[10]

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

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

/*scan_file: read each of the lines of the file.*/
int scan_file(char *filename)
{
    char *line_buf = NULL;
    size_t line_buf_size = 0;
    ssize_t line_size;
    char *next = NULL;

    FILE *fp = fopen(filename, "r");
    if (!fp) {
        fprintf(stderr, "Error opening file '%s'\n", filename);
        return 1;
    } 
    /*Get the first line of the file and do nothing with it*/
    line_size = getline(&line_buf, &line_buf_size, fp);
    while (line_size > 0)
    {
        //second and subsecuent lines
        line_size = getline(&line_buf, &line_buf_size,fp);
        if (line_size <= 0)
            break;
        line_buf[line_size-1] = '\0'; /*removing '\n' */
        char *part = strtok_r(line_buf, "    ", &next);
        if (part)
            printf("NUMBER: %s\n", part);
    }

    // don't forget to free the line_buf used by getline
    free(line_buf);
    line_buf = NULL;
    fclose(fp);

    return 0;
}


int main(void)
{
    scan_file("file.txt");
    return 0;
}

ПРИМЕЧАНИЕ. Здесь я предполагаю, что файл называется file.txt, вы должны изменить его на имя вашего файла.

ВЫВОД:

NUMBER: 1
NUMBER: 2
NUMBER: 3
NUMBER: 4
NUMBER: 5
NUMBER: 6
NUMBER: 7
NUMBER: 8
NUMBER: 9
NUMBER: 10

Я поставил это таким образом, чтобы вы могли идентифицировать строку printf("NUMBER: %s\n", part);, здесь вы можете изменить ее на что-то, что поместит это значение в динамический массив.

person Gealber    schedule 30.11.2020
comment
О, спасибо, да, я знаю предел, так как на самом деле это все, что я публикую (довольно коротко), спасибо, я это реализую. - person ; 30.11.2020
comment
Строка может не заканчиваться '\n' (возможно, последней строкой ввода), что делает line_buf[line_size-1] = '\0'; неверным. - person chux - Reinstate Monica; 30.11.2020
comment
Совершенно верно, я понял вашу мысль. - person Gealber; 30.11.2020