Вкладка «Разбор табуляции» разделяет строки в массиве на языке программирования C - PullRequest
0 голосов
/ 26 августа 2009

Имеется файл (например, myfile.txt) с этим содержимым (всегда три строки):

 0 2 5 9 10 12
 0 1 0 2 4 1 2 3 4 2 1 4
 2 3 3 -1 4 4 -3 1 2 2 6 1

Как мы можем проанализировать файл, чтобы он был сохранен в массивах, как если бы они были жестко запрограммированы таким образом:

int Line1[] = { 0, 2, 5, 9, 10, 12 };

int Line2[] =    { 0, 1, 0,  2, 4, 1,  2, 3, 4, 2, 1, 4 };

double Line3[] = { 2, 3, 3, -1, 4, 4, -3, 1, 2, 2, 6, 1 };

Обновление : на основе комментариев wrang-wrang. Я в настоящее время застрял с этим кодом.

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

int main  ( int arg_count, char *arg_vec[] ) {
    int ch;
    FILE * fp;
    int i;

    if (arg_count <2) {
        printf("Usage: %s filename\n", arg_vec[0]);
        exit(1);
    }


    //printf("%s \n\n", arg_vec[i]); // print file name

    if ((fp = fopen(arg_vec[1], "r")) == NULL) { // can't open file

        printf("Can't open %s \n", arg_vec[1]);
        exit(1)
    }



    const unsigned MAX_N=1000;
    int Line1[MAX_N];
    int Line2[MAX_N];
    double Line3[MAX_N];
    unsigned N3=0;


    // Parsing content

    while ((ch = fgetc(fp)) != EOF) {

        if (ch=='\n' || ch=='\r') break;
        ungetc(ch,fp);

        assert(N3<MAX_N);
        fscanf(fp, " %1f", &Line3[N3++]);

        // not sure how to capture line 1 and 2 for 
        // for array Line1 and Line2
     }

         fclose(fp);

         // This fails to print the content the array
         for (int j=0; j <Line3; j++) {
             printf(Line3[j],"\n");
         }    

    return 0;
}

В принципе у меня проблема в:

  1. Поиск способов назначения каждой строки правильному массиву.
  2. Распечатка содержимого массива (для проверки).

Ответы [ 3 ]

3 голосов
/ 26 августа 2009

strtok () в string.h должно выполнить работу.

1 голос
/ 26 августа 2009

Вот менее обычный подход, который делает только один проход через входные байты. Scanf пропустит пробел для вас, но вы не хотите, чтобы он пропускал новые строки. Пока ваши новые строки сразу же следуют за последним непробельным символом, чтение одного символа и возврат его обратно, если это не перевод строки, будут работать. Более надежное решение может вручную проанализировать пробелы и вернуть первый непробельный символ перед scanf.

Возможно, проще было бы просто скопировать непробельные символы в буфер и использовать одно из преобразований строка-> число (sscanf, strtol и т. Д.).

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

#include <stdio.h>
#include <assert.h>

const unsigned MAX_N=1000; /* use malloc/realloc if it matters to you */
double Line3[MAX_N];
unsigned N3=0;

unsigned c;
FILE *f;
f=fopen("myfile.txt","r");
while ((c=fgetc(f)) != EOF) {
  if (c=='\n'||c=='\r') break;
  ungetc(c,f);
  assert(N3<MAX_N);
  fscanf(f," %lf",&Line3[N3++]); /* the space means 'skip whitespace' */
} /* Line3 holds N3 items */

/* similar for int except fscanf " %d" */
1 голос
/ 26 августа 2009
  1. Вам понадобятся динамически распределенные массивы. Если вы не можете быть абсолютно уверены во время компиляции в объеме данных, которые вы собираетесь прочитать (а вы не можете или, по крайней мере, не должны), вам придется использовать указатели на массивы, выделенные с malloc() и realloc(). Если вы не знаете, как это сделать, читайте об управлении памятью в C.
  2. Вам нужно будет преобразовать char * (текстовые) данные в числовые типы. Мои личные любимые функции - strtol() и strtod(), но есть также функции atoi() и atof(), которые могут быть доступны. Однако, поскольку мы работаем с файловым потоком, здесь вам может повезти с fscanf(), чтобы выполнить преобразование для вас. Все эти функции находятся в стандартной библиотеке, кроме strtod(), которая специфична для C99 (так что она есть, если вам повезет).

Если вы не знаете, как использовать какие-либо из названных здесь функций, должно быть легко найти man-страницы для них, либо в вашей системе (раздел 3, например, man 3 malloc), либо в Интернете ( malloc). (3) ) * * тысяча двадцать-одна

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