Получение данных из файла и распечатывание их каждый раз, когда начинается новая строка - PullRequest
0 голосов
/ 14 июня 2019

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

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

Данные в используемом им файле имеют следующий формат:
<DESCRIPTION>data,<DESCRIPTION>data,<DESCRIPTION>data и т. Д.
Данные являются как int, так и chars.

Поскольку данные разделены символом "," я думал о том, чтобы сначала поместить все "<DESCRIPTION>data" в подстроки с помощью функции strtok, которую мне удалось найти во время поиска в Google, после этого я бы сканировал только часть "DESCRIPTION", а затем поместите нужные данные в массив, который я затем распечатал бы при достижении конца массива (конец строки), а затем перешел на следующую строку до конца файла.

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

#include <stdio.h>
#include <ctype.h>

void get9202() {
  char
  const * str;
  const char s = ",";
  char * token;

  /*open database file*/
  FILE * fp = fopen("datafile.dat", "r");

  /*create array with all lines of data
  I would like it to be able to handle unknown amounts of data.
  current file is ~177000 lines of data.*/
  int i = 0;
  char line[i];

  /*checking until end of file*/
  while (fgets(line, sizeof(line), fp)) {
    /*This part has to be included in the loop somehow but put in here 
    so that you might get a picture of what im trying to do.*/

    while ( * str) {
      if (!isspace( * str++))
        i++;
      else break;
      /*not entirely sure how to exit this subloop 
                         to print out the data and go to new line*/
    }

    /*trying to segment the string into an array of substrings 
    but dont know when to introduce x*/
    token[x] = strtok(str, s);

    while (token[x] != NULL) {
      printf("%s\n,", token);
    }

  }

  return result;
  /* dont know how to return the file to main*/
  flclose("datafile.dat");
}

Если данные выглядят так:

<SYMBOL>9202.T,<SYMSTAT>2,<MSGSTAT>0,<TIME>20:50:40.905246,<SYS_DT>2018/07/19,<SYS_TIM>20:50:40.503,<SYS_TIMU>20:50:40.503236
<SYMBOL>9202.T,<SYMSTAT>2,<MSGSTAT>0,<TIME>20:51:40.000235,<SYS_DT>2018/07/19,<SYS_TIM>20:51:39.598,<SYS_TIMU>20:51:39.598597

ожидаемый файл может выглядеть как

9202.T,2,0,20:50:40.905246
9202.T,2,0,20:51:40.000235

при выборе нужных частей некоторые исчезнут.

1 Ответ

0 голосов
/ 14 июня 2019

Несколько проблем:

  1. Будет объявлен массив нулевой длины.

    int i=0;
    char line[i];
    
  2. fclose никогда не выполняется, поскольку return также fclose нуждается в FILE * в качестве аргумента.

    return result; 
    /* dont know how to return the file to main*/
    flclose("datafile.dat");
    

Предложения:

пытается сегментировать строку в массив подстрок, но
не знает, когда ввести x

Использовать fgets с fscanf чтобы проанализировать вашу строку, так как все строки идентичны.

Не знаю, как вернуть файл на главную

Определить structureс необходимыми полями и вернуть его в main.


Пример:

typedef struct {

  char symbol[50];
  char symstat;
  char msgstat;
  char time[50];
}data;

data *get9202(int *numData) {

  int memAllocated = 10;
  data *mData = malloc(sizeof(*mData) * memAllocated);

  FILE *fp = fopen("datafile.dat", "r");

  char buf[3000];
  int i = 0;

  while (fgets(buf, sizeof buf, fp) != NULL) {

    if (i == memAllocated) {
      memAllocated *= 2;

      void *temp = realloc(mData, sizeof( *mData) * memAllocated);
      if (temp != NULL) mData = temp;
      else break; //error
    }

    if (sscanf(buf, "<SYMBOL>%[^,],<SYMSTAT>%c,<MSGSTAT>%c,<TIME>%[^,]",
        mData[i].symbol, &mData[i].symstat, &mData[i].msgstat, mData[i].time) == 4) {
      i++;
    } else {
      printf("error\n"); //error
    }
  }
  fclose(fp);

  *numData = i;
  return mData;
}

int main() {
  int len = 0;
  data *mData = get9202( &len);

  int i = 0;
  for (i = 0; i < len; i++)
    printf("%s,%c,%c,%s\n", mData[i].symbol, mData[i].symstat, mData[i].msgstat,
      mData[i].time);

  if (mData) free(mData);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...