2015-11-03 1 views
0

У меня проблемы с запуском проекта, который мне был назначен. Я не могу использовать строковые операторы, fgets и т. Д. Мне нужно отсканировать файл в EOF.Использование fscanf для чтения строки, а затем переменное число целых чисел для EOF

Вот пример файла:

AND 3 2 1 
OR 4 5 6 
SPECIAL 4 5 6 7 

То, что я пытался сделать, это настроить время цикла:

while (fscanf(circuit, "%s", cur_gate) != EOF){ 

затем попытался проверить, что cur_gate строка:

if (cur_gate[0] == 'A'){ 

Проблема в том, что я не знаю, как сканировать 3 целых числа после прочтения строки. Затем, в конце концов, после чтения SPECIAL мне нужно сканировать 4 целых числа.

Я хочу сохранить первое целое число в массиве с именем Output, а остальное - в массиве с именем INPUT.

Итак, чтобы обобщить строку, а затем fscanf переменное количество целых чисел в зависимости от строки, которую я прочитал?

+1

Вы можете fscanf строку, а затем посмотреть, что строка, а затем прочитать правильное количество чисел в соответствии с тем, что строка –

+2

Что вы пробовали? Это бонус, чтобы сделать это самостоятельно, используя учебники, не спрашивая нас. Вы должны получить классическую книгу K & R на C, которая ответит на большинство из того, что вы пытаетесь выполнить. – t0mm13b

+0

Звучит так, как будто вы должны использовать 'fgetc' и самостоятельно разбирать файл. – user3386109

ответ

1

Основываясь на том, что я понял из вашего вопроса, ниже код поможет вам.

Я предположил, что вы просто хотели сохранить все выходы только в одном массиве и аналогично всем входам в одном массиве. Итак, в соответствии с вашим примером вы хотите сохранить 3,4,4 (первое целое после слова) в выходном массиве. Остальные целые числа должны перейти в другой входной массив.

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

#define MAX_CHAR 256 
#define MAX_IN 100 
#define MAX_OUT 100 

enum 
{ 
    FALSE = 0, 
    TRUE 
}; 

int main() 
{ 
    char word[MAX_CHAR]; 
    FILE *fp; 

    int i = 0, in[MAX_IN]; 
    int o = 0, out[MAX_OUT]; 

    int flag = FALSE; 

    fp = fopen("dict.txt","r"); 
    if(NULL != fp) 
    { 
     while(fscanf(fp, "%s", word) != EOF) 
     { 
      printf("%s\n",word); 
      if(0 != isalpha(word[0])) 
      { 
       flag = TRUE; 
      } 
      else 
      { 
       if(TRUE == flag) 
       { 
        out[o] = atoi(word); 
        o++; 
        flag = FALSE; 
       } 
       else 
       { 
        in[i] = atoi(word); 
        i++; 
       } 
      } 
     } 
     fclose(fp); 
    } 
    int j; 
    printf("INPUT: "); 
    for(j=0; j<i; j++) 
    { 
     printf("%d\t",in[j]); 
    } 
    printf("\n"); 
    printf("OUTPUT: "); 
    for(j=0; j<o; j++) 
    { 
     printf("%d\t",out[j]); 
    } 
    printf("\n"); 
    return(0); 
} 

OUTPUT на примере файла, который вы дали

INPUT: 2  1  5  6  5  6  7 
OUTPUT: 3  4  4 

ОТКАЗ: Код был составлен и протестирован в моем окружении. Я рекомендую вам самостоятельно позаботиться о сценариях обработки ошибок.

+0

Если вызов функции 'fopen()' failed, код все равно попытается распечатать из массивов, но содержимое массивов будет мусором. – user3629249

+0

относительно этой строки: 'while (fscanf (fp,"% s ", word)!= EOF) 'при вызове функции:' fscanf() ', лучший способ выйти из цикла, который учитывает все posibilites, заключается в сравнении с (в данном случае) == 1. Затем введите внутренний цикл, который читает числовые значения. – user3629249

+0

опубликованный ответ не скомпилирован, потому что отсутствует инструкция '#include , поэтому функция isalpha()' не прототипирована – user3629249