Как прочитать специально отформатированные данные из файла? - PullRequest
3 голосов
/ 14 января 2011

Я должен прочитать входные данные и аргументы из файла, похожего на этот формат:

Add  id:324  name:"john" name2:"doe" num1:2009 num2:5 num2:20

Проблема в том, что я не могу использовать fgets. Я пытался с fscanf, но не знаю, как игнорировать «:» и отделить строку «имя:« Джон »».

Ответы [ 2 ]

6 голосов
/ 14 января 2011

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

#define MAXSIZE 32
const char *line = "Add  id:324  name:\"john\" name2:\"doe\" num1:2009 num2:5 num3:20";
char op[MAXSIZE], name[MAXSIZE], name2[MAXSIZE];
int id, num1, num2, num3;
int count =
    sscanf(line,
        "%s "
        "id:%d "
        "name:\"%[^\"]\" "  /* use "name:%s" if you want the quotes */
        "name2:\"%[^\"]\" "
        "num1:%d "
        "num2:%d "
        "num3:%d ", /* typo? */
        op, &id, name, name2, &num1, &num2, &num3);
if (count == 7)
    printf("%s %d %s %s %d %d %d\n", op, id, name, name2, num1, num2, num3);
else
    printf("error scanning line\n");

Выходы:

Добавить 324 Джон Доу 2009 5 20

В противном случае я бы вручную анализировал входные данные, считывая символ за раз, или выбрасывал их в буфер, если по какой-либо причине использование fgets() было запрещено.Иметь его в буфере всегда проще, чем не ИМХО.Тогда вы могли бы использовать другие функции, такие как strtok() и еще много чего, чтобы выполнить анализ.

1 голос
/ 14 января 2011

возможно, это то, что вы хотите?

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

int main()
{
char str[200];
FILE *fp;

fp = fopen("test.txt", "r");
while(fscanf(fp, "%s", str) == 1)
  {
    char* where = strchr( str, ':');
    if(where != NULL )
    {
      printf(" ':' found at postion %d in string %s\n", where-str+1, str); 
    }else
    {
      printf("COMMAND : %s\n", str); 
    }
  }      
fclose(fp);
return 0;
}

Если результат будет

COMMAND : Add
 ':' found at postion 3 in string id:324
 ':' found at postion 5 in string name:"john"
 ':' found at postion 6 in string name2:"doe"
 ':' found at postion 5 in string num1:2009
 ':' found at postion 5 in string num2:5
 ':' found at postion 5 in string num2:20
...