Ввод/вывод файлов на языке C

#c

Вопрос:

Я столкнулся с проблемой с функцией ниже. Я пытаюсь получить данные из одного места, а затем выполнить поиск по указанной строке. После этого я печатаю полученное значение. Впервые это работает нормально. Однако, если я вызову функцию с помощью цикла for, я не смогу распечатать значение буфера.

 void parse_data(char *fname,int flag) {  char str[30]="amp;lt;Responseamp;gt;";  char buffer[1024],temp[1024],temp1[1024];  int nVal=0;  FILE *fp;  int s_pos; //string position in the text  int c_pos; //char position in the text  char *string;  char ccnt; //char count  long lSize;  long pos=0;  int c;  s_pos = -1;  c_pos = 0;  fp=fopen(fname,"r");  //fseek(fp, 1, SEEK_SET);  string = malloc(strlen(str) 1);  if(fp==NULL)  {  printf("Unable to open the file n");  exit(0);  }   while (!feof(fp))  {  if (c_pos == 0)  {  for (ccnt = 1; ccnt lt;= strlen(str); ccnt  )  {  if (!feof(fp))  {  string[ccnt - 1] = getc(fp);  if(nVal==1)  {  buffer[pos  ] = string[ccnt -1];  }  } //if  }//for   }//if  if (c_pos != 0)  if (!feof(fp))  {  for (ccnt = 0; ccnt lt;= strlen(str) - 2; ccnt  )  string[ccnt] = string[ccnt   1];  string[strlen(str) - 1] = getc(fp);  if(nVal==1){  buffer[pos  ] = string[strlen(str) - 1];  }  }  if (strcmp(string, str) == 0)  {   strcpy(str,"amp;lt;/Responseamp;gt;");   s_pos = c_pos;  if(nVal==1){  buffer[pos-strlen(str)]='';  break;  }  nVal=1;   }  c_pos  ;  }  if(fp!=NULL)  fclose(fp);  //printf("n The String position is %d=n",s_pos);  if(flag==0)  ParsingString_Inserting_To_DataBase(buffer);  else if(flag==1)  printf("The Buffer Value is %s n",buffer); }  int main() {  int i=0;  char fname[30]="/tmp/gcc_trans.html";  for(i=0;ilt;3;i  )  parse_data(fname,1);  return 0; }  

Комментарии:

1. Что ты пытаешься сделать? Зачем выполнять одну и ту же функцию 3 раза с одинаковыми параметрами? Он каждый раз открывает и закрывает один и тот же файл, поэтому мы ожидаем одного и того же результата 3 раза, если предположить, что файл не изменится….

Ответ №1:

Я пытался понять ваш код и потерпел неудачу. Некоторые комментарии:

1.Используйте значимые имена переменных. Попробуй pattern вместо str этого . Используйте лучшее название для ccnt , nVal

  1. Вместо сложных петель попробуйте этот подход:
    • Читайте символ за символом, пока не найдете amp;
    • Прочитайте N байтов и проверьте, находятся ли они там lt;Responseamp;gt; , где N-длина строки. Если это так, разорвите петлю. Если это не так, найдите N байтов в обратном порядке.
    • Сохраните текущее смещение в файле
    • Повторите приведенный выше код с amp;lt;/Responseamp;gt; помощью . Переместите этот код во вспомогательную функцию.
    • N = текущее смещение — первое смещение
    • Выделите буфер с N байтами
    • стремитесь сначала компенсировать
    • считывание N байтов в буфер