我想在不使用数组的情况下快速排序文件编号。但是,我不知道如何用另一个替换特定位置的数字。 我开始制作这段代码:
int main()
{
FILE* F1=fopen("file.txt","r+");
int var1, var2, min;
while(fscanf(F1, "%d", &var1) ==1){
min = var1;
long pos1 = ftell(F1);
fseek(F1, 0, SEEK_SET);
while(fscanf(F1, "%d", &var2) ==1){
if(min > var2)
{
//Replace the var2 by min in the file
}
}
fseek(F1, pos1, SEEK_SET);
}
}
请,有可能吗?
答案 0 :(得分:2)
没有使用数组就没有合理的方法。这就是我要做的事情:
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef ENOENT
#define ENOENT 2
#endif
static int comp(const void *a, const void *b)
{
const int va = *(const int *)a;
const int vb = *(const int *)b;
return va > vb ? 1 : va == vb ? 0 : -1;
}
int main(int argc, char **argv)
{
enum {PAGE_SIZE = 4096, INTS_PER_PAGE = PAGE_SIZE / sizeof(int)};
int *arr = (int *)malloc(PAGE_SIZE);
int *beg = arr;
int *end = arr;
size_t arr_size = 0;
size_t max_arr_size = INTS_PER_PAGE;
FILE *f;
if (arr == NULL) {
perror("malloc(3)");
return errno;
}
if (argc < 2) {
fprintf(stderr, "%s\nusage: kwiksort input_file\n",
strerror(ENOENT));
return ENOENT;
}
f = fopen(argv[1], "r+");
if (f == NULL) {
perror("fopen(3)");
return errno;
}
loop:
for (; arr_size < max_arr_size; ++arr_size, ++end)
if (fscanf(f, "%d", end) == EOF)
goto sort;
max_arr_size += INTS_PER_PAGE;
arr = (int *)realloc(arr, max_arr_size * sizeof(int));
if (arr == NULL) {
perror("realloc(3)");
return errno;
}
beg = arr;
end = arr + arr_size;
goto loop;
sort:
qsort(arr, arr_size, sizeof(int), comp);
rewind(f);
while (beg < end)
fprintf(f, "%d\n", *beg++);
fclose(f);
free(arr);
return 0;
}