C:排序不适合数组的长列表

时间:2016-08-31 21:30:30

标签: c file sorting

我在一个文本文件中有一个80370长的30位数字列表,每个都在一个单独的行中 我想用C对它们进行排序。

我的想法是创建一个新文件,然后将第一个数字添加到其中 然后,每次我们将它与另一个数字进行比较。如果它更小,则追加另一个数字。简单。但是,如果它更大,则必须预先添加新号码 我尝试过这样的前缀:

void prepend(char line[], FILE* w, FILE* waux, char filename[], char auxname[]) {
    fprintf(waux, "%s\n", line); //print new number to new file (waux)
    char ch;
    while((ch = fgetc(w)) != EOF) {
        fputc(ch, waux); //read old file (w) and add to new file (waux)
    }
    remove(filename); //delete old file
    rename(auxname, filename); //rename new file to old file's name
}

然后我尝试读取输出并填充NULL字符(在Notepad ++中) 在百万个空字符中,我们可以找到数字,但它们根本没有排序。

1 个答案:

答案 0 :(得分:3)

虽然我同意您应该使用malloc为所有数据分配内存的注释,然后对内存中的数据进行排序,然后将数据写入文件,我也认为您的方法也应该有效。

我猜你的方法不起作用的原因是你在使用时有文件的打开文件句柄

remove(filename); //delete old file
rename(auxname, filename); //rename new file to old file's name

我的建议:

  1. 打开功能中的文件。
  2. 阅读并追加。
  3. 关闭文件。
  4. 然后执行删除并重命名。
  5. void prepend(char line[], char filename[], char auxname[]) {
    
       FILE* w = fopen(filename, "r");
       if ( w == NULL )
       {
          fprintf(stderr, "Unable to open %s for reading from.\n", filename);
          return;
       }
    
       FILE* waux = fopen(auxname, "w");
       if ( waux == NULL )
       {
          fprintf(stderr, "Unable to open %s for writing to.\n", auxname);
          fclose(w);
          return;
       }
    
       fprintf(waux, "%s\n", line); //print new number to new file (waux)
       int ch;
       while((ch = fgetc(w)) != EOF) {
          fputc(ch, waux); //read old file (w) and add to new file (waux)
       }
    
       fclose(waux);
       fclose(w);
    
       remove(filename); //delete old file
       rename(auxname, filename); //rename new file to old file's name
    }