2012-02-24 7 views
0

Im просматривает файл. если я столкнулся с «#», я хочу игнорировать все, пока не доберусь до «\ n» . моя текущая логика не работает.игнорировать символы между двумя символами

Im пытаясь раздеть комментарии из файла я думаю, что эта проблема имеет что-то делать с моей логикой в ​​секунду в то время как петля

int wishforint(FILE *in) 
{ 
char c; 
int d; 
int i=0; 
int smarr[5]; 

while(i<5) 
{ 
    fscanf(in, "%c", &c); 
    printf("c is %c\n",c); 

    if(isdigit(c)) 
    { 
     ungetc(c, in); 
     fscanf(in, "%d", &d); 
/*add this later. 
return d; 
*/ 
     smarr[i]=d; 
     printf("smarr[%d]= %d\n",i,d); 
     i++; 
    } 
    else if(c=='#') 
    { 
     while(fscanf(in,"%c",&c) != EOF && c != '\n') 
     {} 
     break; 
    } 
} 


    printf("Width is = %d\n", smarr[1]); 
    printf("Height is= %d\n", smarr[2]); 
    printf("Max value= %d\n", smarr[3]); 

    return 7; 
} 
+0

Вы пытаетесь снять комментарии из исходного файла да? Также, пожалуйста, напишите весь код. Например, где объявляется «i»? – erisco

+0

Да, я пытаюсь снять комментарии. полный код добавил – Cooldog117

ответ

4

«#» не является цифрой, так что вы, вероятно, попав в continue перед тем, как перейти к else if.

1

Две проблемы с кодом.

Первый fscanf не проверяет наличие EOF. Fix:

 

    //fscanf(in, "%c", &c); 
    if (fscanf(in, "%c", &c) == EOF) { break; } 

Во-вторых, там не должно быть 'перерыв' в пункте '#':

 

    else if(c=='#') 
    { 
     while(fscanf(in,"%c",&c) != EOF && c != '\n') 
     {} 
     //break; 
    } 

+0

, если я вырву, я получаю бесконечный цикл. – Cooldog117

+0

Разрыв должен быть, когда вы найдете EOF в верхней части цикла с первым fscanf. Я проверил ваш код с изменениями, которые я сделал, и он работал нормально. Перерыв - это не то место. Он должен быть с первым fscanf, а не третьим. – Okken

0

Может быть использование sscanf и fgets будет более легко?

Вероятно, что-то вроде этого:

while (fgets(buf, BUF_LENGTH, in) != NULL){ 
    errno=0; 
    if ((sscanf(buf, "%d", &d) == 0) && (errno == 0)){ 
     //we have a comment 
     continue; 
    }else if(errno != 0){ 
     //error handling 
    } 
    //we have a value 
    smarr[i]=d; 
    i++; 
} 

Он должен хорошо работает с файлом один-значение-в-колонке. Где комментарии начинаются с начала новой строки или после значения.

Можете ли вы показать пример входных данных?

Смежные вопросы