Чтение текстового файла в массив в C - PullRequest
0 голосов
/ 19 сентября 2019

Я хочу разобрать файл .txt в одномерный массив на C. Я использую функцию fgets для считывания содержимого файла в массив («waveform» как массив, в который должно быть помещено содержимое файла).сохранен - ​​определяется как "символ").Сохраненные значения должны быть сохранены в новый массив как целочисленные значения.Я не уверен, где я иду не так.PS: я новичок в программировании на C, пожалуйста, потерпите меня :) Пожалуйста, не обращайте внимания на проблемы с индексированием, вызванные вставкой

int main(){
    int a, win[10];

    FILE *filename = fopen("testFile.txt","r");
    char waveform[10];

    if (filename == NULL)
    {
        printf("Error opening file.\n");
        exit(8);
    }

    for(int i =0;1;i++){
        if(fgets(waveform[i], 10, filename) == NULL);
        break;

                if(i < 10)
            {
           a = atoi(waveform[i]);
           win[i] = a;
            }
         }

    fclose(filename);

    return 0; 
}

Ошибки компилятора - внедренное изображение

Данные в testFile.txt: от 1 до 10 в векторе.

Ответы [ 3 ]

1 голос
/ 19 сентября 2019

В этом цикле есть несколько ошибок

for(int i =0;1;i++){
    if(fgets(waveform[i], 10, filename) == NULL);
    break;

            if(i < 10)
        {
       a = atoi(waveform[i]);
       win[i] = a;
        }
     }

Для начала стоит точка с запятой после оператора if

    if(fgets(waveform[i], 10, filename) == NULL);
                                               ^^^

Во-вторых, вызов fgets

fgets(waveform[i], 10, filename) 
              ^^^

неверен, потому что тип выражения waveform[i] равен char.И соответственно это утверждение

a = atoi(waveform[i]);

также недопустимо.

Должно быть не менее

fgets( waveform, 10, filename) 

и

a = atoi( waveform );

Полагаю, чтокаждая строка файла содержит ровно одно число.(В противном случае вы должны использовать, например, sscanf для извлечения чисел из строки, используя внутренний дополнительный цикл.)

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

int i = 0;
for ( ; i < 10 && fgets( waveform, 10, filename) != NULL; i++ )
{
    a = atoi( waveform );
    win[i] = a;
}

После цикла переменная i будет содержать фактическое количество элементов массива win.

Обратите внимание, что имя filename не подходит для указателя типа FILE *.Имя файла - это строка "testFile.txt" в вашем коде.

0 голосов
/ 19 сентября 2019

Вы на правильном пути.Вот мой вклад по теме:

  1. Открыть файл (fopen)
  2. Подсчитать количество строк (getc и rewind)
  3. Считать все строки в массив (getline)
  4. Освободить память и закрыть файл (free и fclose)

Пример кода:

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

int main(int argc, char *argv[])
{

  // Open File
  const char fname[] = "testFile.txt";

  FILE *fp = fopen(fname, "r");

  if( !fp )
    goto error_open_file;
  printf("Opened file: %s\n", fname); 

  // Count Lines
  char cr;
  size_t lines = 0;

  while( cr != EOF ) {
    if ( cr == '\n' ) {
      lines++;
    }
    cr = getc(fp);
  }
  printf("Number of lines: %ld\n", lines); 
  rewind(fp);

  // Read data
  {// 'goto' + data[lines] causes error, introduce block as a workaround
    char *data[lines];
    size_t n;

    for (size_t i = 0; i < lines; i++) {
      data[i] = NULL;
      size_t n = 0;

      getline(&data[i], &n, fp);

      if ( ferror( fp ) )
        goto error_read_file;

    }

    for (size_t i = 0; i < lines; i++) {
      printf("%s", data[i]);
      free(data[i]);
    }
  }

  // Close File
  fclose(fp);

  return 0;

error_read_file:
  perror("fopen ");
  return 1;

error_open_file:
  perror("getline ");
  return 2;

}
0 голосов
/ 19 сентября 2019

Если вы хотите использовать функцию fgets(), вам не нужно помещать ее в цикл.Действительно, второй аргумент fgets() - это количество элементов, которые вы хотите прочитать.
Я бы поместил fgets() в однострочную инструкцию, а затем сделал бы цикл от 0 до 10, чтобы выполнить преобразование из charint с функцией atoi().Более того, у вас есть ; в конце вашего if() оператора, так что вы будете выполнять его не так, как хотите.

...