Как прочитать строку из файла? - PullRequest
2 голосов
/ 13 ноября 2008

Мне нужно прочитать текстовый файл с форматированными строками так:

1: (G, 2), (F, 3)
2: (G, 2), (F, 3)
3: (F, 4), (G, 5)
4: (F, 4), (G, 5)
5: (F, 6), (c, w)
6: (p, f), (G, 7)
7: (G, 7), (G, 7)
w: (c, w), (c, w)

Каждая строка будет содержать структуру со своими данными (5 цифр или букв в ней).
Какой лучший способ прочитать строку и получить нужные мне строки?
В настоящее время я использую длинную последовательность условий, используя fgetc, но это кажется уродливым и не очень умным. Я не могу использовать массивы, потому что строки могут различаться по размеру, если числа состоят из двух цифр.

Ответы [ 8 ]

6 голосов
/ 13 ноября 2008

Я думаю, что вы могли бы разобрать это следующим образом:

fscanf(file,"%c: (%c, %c), (%c, %c)", &first,&second,&third,&fourth,&fifth);
3 голосов
/ 13 ноября 2008
#include <stdio.h>

int main (void)
{
  char buf[81];       /* Support lines up to 80 characters */
  char parts[5][11];  /* Support up to 10 characters in each part */

  while (fgets(buf, sizeof(buf), stdin) != NULL)
  {
    if (sscanf(buf, "%10[^:]: (%10[^,], %10[^)]), (%10[^,], %10[^)])",
               parts[0], parts[1], parts[2], parts[3], parts[4]) == 5)
    {
      printf("parts: %s, %s, %s, %s, %s\n",
             parts[0], parts[1], parts[2], parts[3], parts[4]);
    }
    else
    {
      printf("Invalid input: %s", buf);
    }
  }
  return 0;
}

Пример прогона:

$ ./test
1: (G, 2), (F, 3)
2: (G, 2), (F, 3)
3: (F, 4), (G, 5)
4: (F, 4), (G, 5)
5: (F, 6), (c, w)
6: (p, f), (G, 7)
7: (G, 7), (G, 7)
w: (c, w), (c, w)
parts: 1, G, 2, F, 3
parts: 2, G, 2, F, 3
parts: 3, F, 4, G, 5
parts: 4, F, 4, G, 5
parts: 5, F, 6, c, w
parts: 6, p, f, G, 7
parts: 7, G, 7, G, 7
parts: w, c, w, c, w

Если последнее значение во вводе превышает 10 символов, оно будет усечено без указания ошибки, если это недопустимо, вы можете использовать спецификатор преобразования %c в качестве шестого аргумента для захвата следующего символа после последнее значение и убедитесь, что это закрывающая скобка.

3 голосов
/ 13 ноября 2008

Использование fgets():

#include <stdio.h>

int main(void)
{
  char line[256];
  while(fgets(line, sizeof(line), stdin) != NULL)  // fgets returns NULL on EOF
  {
    // process line; line is guaranteed to be null-terminated, but it might not end in a
    // newline character '\n' if the line was longer than the buffer size (in this case,
    // 256 characters)
  }

  return 0;
}
0 голосов
/ 13 ноября 2008

Если у вас есть правильные переменные, это должно работать:

 fscanf(fp, "%[^:]: (%[^,], %[^)]), (%[^,], %[^)])", a, b, c, d, e);

fp - указатель файла и "a" - "e" являются указателями на символы

0 голосов
/ 13 ноября 2008

Обычно вам нужно сохранить положение файла ptr с помощью fgetpos, перейти к концу строки (как бы вы его ни определили), сохранить этот размер, fsetpos на предыдущую позицию, выделить буфер, достаточно большой для хранения строки, а затем вызовите fread с новым буфером.

0 голосов
/ 13 ноября 2008
#include
void
f()
{
    FILE* fp;

    if ( (fp = fopen("foo.txt", "r")) == NULL)
    {
        perror("fopen");
        return;
    }

    char ch[5];
    while (fscanf(fp, "%c: (%c, %c), (%c, %c)\n", &ch[0], &ch[1], &ch[2], &ch[3], &ch[4]) == 5)
    {
        printf("--> %c %c %c %c %c\n", ch[0], ch[1], ch[2], ch[3], ch[4]);
    }

fclose(fp);
}
0 голосов
/ 13 ноября 2008

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

Разве это не домашняя работа?

#include <stdio.h>

void main(int argc, char **argv) {
    FILE * f;
    f = fopen(argv[1], "r");

    while (1) {
        char char_or_num[32][5]; // five string arrays, up to 32 chars
        int i;
        int did_read;

        did_read = fscanf(f, "%32[0-9a-zA-Z]: (%32[0-9a-zA-Z], %32[0-9a-zA-Z]), (%32[0-9a-zA-Z], %32[0-9a-zA-Z])\n", char_or_num[0], char_or_num[1], char_or_num[2], char_or_num[3], char_or_num[4]);
        if (did_read != 5) {
            break;
        }
        printf("%s, %s, %s, %s, %s\n", char_or_num[0], char_or_num[1], char_or_num[2], char_or_num[3], char_or_num[4]);
    }

    fclose(f);
}
0 голосов
/ 13 ноября 2008

fgets () и sscanf (), насколько я помню

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