Как прочитать 4-колоночный текстовый файл в два массива символов в C? - PullRequest
0 голосов
/ 20 декабря 2018

C - Как прочитать файл из 4 столбцов в два строковых массива

Я пытаюсь прочитать файл неизвестной длины, который имеет следующий формат:

2082018 1200 79 Meeting
3082018 1300 60 Lunch
4082018 1400 30 Dinner
5082018 0600 90 Work

Япытается получить первый столбец внутри массива KEY_arr, а остальные столбцы внутри VAL_arr так, чтобы:

KEY_Arr[0] = "2082018" и VAL_arr[0] = "1200 79 Meeting"

Я попробовал два метода, оба безуспешно.В первом методе, который я попытался прочитать в файле, используя getc в 2D-массиве:

int main(int argc, char** argv) {
    FILE *inp_cal;
    int word_count = 0;
    char c;
    char arr[50][50];
    int char_count = 0;
    int space_cnt = 0;
    char line[100];
    int line_count = 0;
    inp_cal = fopen("calendar_out.txt", "r");

            if (inp_cal) {
            printf("Processing file...\n");
            while ((c = fgetc(inp_cal)) != EOF) {
                if ((c == ' ' || c == '\n') && space_cnt == 0) {
                    arr[word_count][char_count] = '\0'; //Terminate the string
                    char_count = 0; //Reset the counter.
                    word_count++;
                    space_cnt = 1;
                } else {
                    if ((c == ' ' || c == '\n') && space_cnt == 1) {
                        word_count++;
                        char_count = 0; 
                    }

                    arr[word_count][char_count] = c;
                    printf("%c", arr[word_count][char_count]);

                    if (char_count < 50) {
                        char_count++;
                    } else {
                        char_count = 0;
                    }
                }
            }
        } else {
            printf("no file found.\n");
        }
    printf("\nword count: %d, char count: %d\n\n", word_count, char_count);
    for (int i = 0; i < word_count; i++) {
        printf("%s\n", arr[i]);
    }



    return (EXIT_SUCCESS);
}

Это дает следующий вывод:

2082018
1200
 79
 Meeting

3082018
 1300
 60
 Lunch

4082018
 1400
 30
 Dinner

5082018
 0600
 90
 Work

Я застрял, когда дело доходит доразделение на отдельные строки для пар ключ и значение.

Второй метод, который я пытался использовать fgets, но мне не удалось получить какой-либо правильный вывод:

if (inp_cal) {
    printf("Processing file...\n");
    while (fgets(line, sizeof line, inp_cal)) {
        char KEY_arr[10];
        char VAL_arr[50];
        char KEY;
        char VAL;

        if (sscanf(line, "%29s%29s", KEY, VAL) != 2) { /* error, bad line */
            printf("Bad line format\n");
        } else {
            KEY_arr[line_count] = KEY;
            VAL_arr[line_count] = VAL;
            printf("%c, %c\n", KEY_arr[line_count], VAL_arr[line_count]);
        }
        line_count++;
    }
} else {
    printf("no file found.\n");
}

Любые предложения поКак я могу улучшить один из вышеперечисленных методов для чтения в текстовом файле с 4 столбцами и хранения в двух массивах символов?

1 Ответ

0 голосов
/ 20 декабря 2018

Используйте fscanf(), поскольку вы знаете формат данных и извлекаете каждый токен в строке.Тогда первый токен - это ваш ключ, а остальные три должны быть вместе, поэтому объедините их с snprintf().

Пример:

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

#define N 10 // max number of lines to be read
#define VALLEN 100
int main(void)
{
  int key_arr[N], a, count = 0;
  char val_arr[N][VALLEN], b[10], c[10], d[10];
  FILE* fp;
  fp = fopen("input.txt", "r");
  char bb[33];
  while (fscanf(fp, "%d %s %s %s", &a, b, c, d) != EOF) {
    if(count < N) {
      key_arr[count] = a;
      snprintf(val_arr[count++], VALLEN, "%s %s %s", b, c, d);
    }
  }
  for(int i = 0; i <count; ++i)
    printf("key=%d, val = %s\n", key_arr[i], val_arr[i]);
  fclose(fp);
  return 0;
}

Выход:

key=2082018, val = 1200 79 Meeting
key=3082018, val = 1300 60 Lunch
key=4082018, val = 1400 30 Dinner
key=5082018, val = 0600 90 Work
...