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