2015-09-05 4 views
0

Мне нужно прочитать файл, который имеет произвольное упорядочение символов ASCII и делать что-то, основанное на любом персонаже, который я получаю. Я могу получить любой из этих типов символов «/», «*», строку или числа. Мне нужно делать что-то другое с каждым случаем. Я думаю, что лучший способ - начать с fgets и читать по строкам. После этого я обычно использовал sscanf, но поскольку файлы, которые я буду читать, имеют случайный порядок символов ASCII, я не уверен, как это сделать. Это то, с чего я начал. Любые идеи очень приветствуются.Прочитать файл со случайным порядком

while(fgets(buffer, 80, fp) != NULL) 
{ 
    /*if(/) 
    { 
     //do something for "/" character 
    } 
    if(*) 
    { 
     //do something for "*" character 
    } 
    if(string) 
    { 
     //do something for string 
    } 
    if(numbers) 
    { 
     //do something for numbers 
    }*/ 
    memset(buffer, 0, 80); 
} 
+0

вы можете попробовать оператор switch или искать таблицу. –

+0

Вы должны пропустить содержимое буфера и выполнить модификацию на каждой итерации. И я не совсем понимаю, в чем цель memset в конце кода. –

+1

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

ответ

0

пример, как это:

while(fgets(buffer, 80, fp) != NULL) 
{ 
    char ch, cx = 0; 
    double n; 

    if(sscanf(buffer, "%c %c", &ch, &cx) == 1){ 
     if(ch == '/'){ 
      puts("/"); 
     } else if(ch == '*'){ 
      puts("*"); 
     } 
    } else if(sscanf(buffer, "%lf %c", &n, &cx) == 1){ 
     puts("number"); 
    } else {//Check further limiting condition? 
     puts("string"); 
    } 
    memset(buffer, 0, 80); 
} 
0

Вы думаете правильно. Ключом к любой из этих проблем типа является чтение строки в буфер, как вы это делали. Затем вы должны понять, что находится в буфере. Как правило, большинство решений может быть принято на первом символе в буфере (например, +,-,/,*,...).

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

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

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

while(fgets(buffer, 80, fp) != NULL) 
{ 
    char *p = buffer; 
    while (*p) 
    { 
     if(/) 
     { 
      //do something for "/" character 
     } 
     if(*) 
     { 
      //do something for "*" character 
     } 
     if(('A' <= *p && *p <= 'Z') || ('a' <= *p && *p <= 'z')) 
     { 
      // do something for string 
      // handle initial char 
      while (*p) { 
       // handle rest of string; 
       p++; 
      } 
      if (!*p) 
       goto nextline; 
     } 
     if('1' <= *p && '9' <= *p) 
     { 
      // do something for numbers 
      convert numbers with atoi() or strtol(), .... 
      if (endofline) 
       goto nextline; 
     } 
     p++; 
    } 
    nextline:; 
    //memset(buffer, 0, 80); /* not needed */ 
} 

Есть более разнообразные и различные способы, чтобы сделать это, чем вы можете качать мертвый кот в. Это зависит от вас, чтобы выбрать метод управления программой, который соответствует вашим данным. Дайте мне знать, если у вас есть вопросы.

+0

Я знаю, что мое понимание указателей не так хорошо, как хотелось бы. Если буфер начинается со строки, как бы она обрабатывает числа? Кажется, это не способ обрабатывать числа после того, как он переходит в оператор if для букв. Это верно? – rocker

+0

Жаль, что я бы не вспомнил strtok. Мне кажется, что я сделал это намного сложнее, чем нужно. – rocker

+0

Это стоит своего веса в золоте, особенно если вы оберните его в цикл for, например. 'char * p; для (p = strtok (str, delim); p; p = strtok (NULL, delim)) '. –