#c #sorting #text-files #structure #binaryfiles
#c #сортировка #текстовые файлы #структура #двоичные файлы
Вопрос:
нас попросили отсортировать содержимое в алфавитном порядке (в данном случае, R.name ) текстового файла и записать его в двоичный файл без сохранения в массив. Что я делал до сих пор, так это просто записывал все содержимое текстового файла в двоичный файл, но я не знаю, как правильно отсортировать его в двоичном файле. Нам сказали, что мы МОЖЕМ использовать сортировку по вставке, но я не имею ни малейшего представления о том, как сортировать двоичные файлы, не зная количества структур внутри.
textFile[] и binFile[] — это имена текстового файла и двоичного файла соответственно
void textToBinary(char textFile[], char binFile[])
{
FILE * fp;
FILE * fp2;
char ch;
String20 dump;
int i;
structRecipe R;
long int npos;
if( (fp = fopen (textFile, "r")) != NULL)
{
if((fp2 = fopen (binFile, "wb"))!= NULL)
{
while( fgets(R.name, 21, fp) != NULL)
{
R.name[strlen(R.name) -1] = '';
fscanf(fp, "%d%c%s%c", amp;R.nServings, amp;ch, R.classifications, amp;ch);
fscanf(fp, "%s%c%d%c", dump, amp;ch, amp;R.nIng, amp;ch);
for(i=0; i<R.nIng; i )
{
fscanf(fp, "%f%c%s%c", amp;R.Ingredients[i].quantity, amp;ch,
R.Ingredients[i].unit, amp;ch);
fgets(R.Ingredients[i].item, 21, fp);
R.Ingredients[i].item[strlen(R.Ingredients[i].item) - 1] = '';
}
fscanf(fp, "%s%c%d%c", dump, amp;ch, amp;R.nSteps, amp;ch);
for(i=0; i< R.nSteps; i )
{
fgets(R.steps[i], 71, fp);
}
fscanf(fp, "%c", amp;ch);
fseek(fp2, 0, SEEK_END);
fwrite(amp;R, sizeof(structRecipe), 1, fp2);
}
fclose(fp2);
}
fclose(fp);
}
else printf("Error opening file for reading n");
}
`
могу ли я иметь хотя бы идеи о том, как отсортировать его, не сохраняя содержимое двоичного файла в массив? (с использованием языка c)
Комментарии:
1. Пожалуйста, отредактируйте свой код и используйте intend, чтобы сделать его более читаемым.
2. Сначала я пытался это сделать, но веб-сайт не позволяет мне загружать его с «правильным» отступом
Ответ №1:
Сортировка по вставке может выглядеть следующим образом:
structRecipe R, tR, *pR[2];
int x, written=0;
pR[0]=amp;R;
pR[1]=amp;tR;
... fill R....
fscanf(fp, "%c", amp;ch);
fseek(fp2, 0, SEEK_SET);
x=0;
for(j=0; j<written; j ) {
fread(amp;tR, sizeof(structRecipe), 1, fp2);
if(strcmp(R.name, tR.name)<0) {
fwrite(amp;R, sizeof(structRecipe), 1, fp2);
x=!x;
break;
}
}
for(; j<written; j ) {
fread(pR[!x], sizeof(structRecipe), 1, fp2);
fseek(fp2, -sizeof(structRecipe), SEEK_CUR);
fwrite(pR[x], sizeof(structRecipe), 1, fp2);
x=!x;
}
fwrite(pR[x], sizeof(structRecipe), 1, fp2);
written ;
}
fclose(fp2);
Извините, это непроверено, всего лишь идея.
Комментарии:
1. постараюсь извлечь что-нибудь из этого, спасибо!!