【问题标题】:Sorting a C file对 C 文件进行排序
【发布时间】:2015-02-26 00:58:55
【问题描述】:

是的,所以我问here 我如何对我的 c 文件进行排序,这是我创建的编码响应。

 #include <stdio.h>
 #include <conio.h>

 int main()
 {     
     FILE *fN;
     FILE *fS;

     fN=fopen("Numbers.txt","r");
     fS=fopen("Sorted.txt","w");
     system("sort Numbers.txt > Sorted.txt");
     getch();
     fclose(fS);
     fclose(fN);
 }

这总是会出现相同的错误消息:该进程无法访问该文件,因为它正在被另一个进程使用。

这是否意味着我显示更改库?,我真的很困惑为什么会出现错误。

【问题讨论】:

  • 问题的标题有点误导,因为您似乎是在尝试使用 C 对文件进行排序,而不是对 C 文件进行排序我>。无论如何,我不明白你为什么使用fopenfclose,因为sort 命令将负责打开和关闭文件。
  • 您正在程序中打开它们,这会阻止sort 访问sorted.txt。如果您不打算在程序中使用它们,为什么要在程序中打开它们?您的 main 的整个主体可能只是与 system 的行。
  • @KenWhite 谢谢....虽然我想这并不是那么明显。
  • 这很明显。您已经用fopen() 打开了Sorted .txt,然后立即尝试通过调用system 来覆盖它,同时将sort 重定向到Sorted.txt,这将因为您调用fopen() 而失败。
  • 我之前的两个 cmets 都没有任何冒犯的意图。我试图通过解释您发布的代码的问题来提供帮助。很抱歉试图提供帮助。我会尽量不要再犯同样的错误。

标签: c file sorting


【解决方案1】:

您在上面发布的代码基本上使用sort 命令行实用程序进行排序。当你写

system("sort Numbers.txt > Sorted.txt");

您正在对Numbers.txt 文件调用sort,然后将命令的输出重定向到文件Sorted.txt

您的代码的问题在于,在您尝试这样做之前,您正在编写

fS=fopen("Sorted.txt","w");

这将打开Sorted.txt 进行写入,在大多数操作系统上,这将锁定文件,使其无法被任何其他进程(包括您的sort 进程)写入。要解决此问题,只需消除所有 fopenfclose 调用并编写

int main() {
    system("sort Numbers.txt > Sorted.txt");
}

公平地说,如果这就是你的程序所做的一切,只需从命令行执行上述命令。但是,如果您将其作为子程序执行,只需使用 system 命令,不要进行任何手动 fopenfclose 调用。

希望这会有所帮助!

【讨论】:

  • 啊,我没有意识到它是从函数内部打开文件的,谢谢。
【解决方案2】:

假设文件不是太大(例如,最多几十兆字节,或者在具有 16GB RAM 的强大桌面上为几千兆字节),因此它的内容适合内存,您可以使用循环逐行读取它getline(3)(或者 fgets 在一些适当大的缓冲区上),strdup(3) 每个读取行并将其放入一些动态分配的(使用 calloc(3)realloc(3))指针数组中,然后在其上调用 qsort(3)如果您想对字符串进行排序,请使用在strcmp(3) 之上构建的比较函数。

如果您按照上述说明进行操作,则您不会依赖任何外部 sort 命令,这可能并非在所有系统上都可用。

如果文件只包含数字,请使用fscanf(3)(或sscanfstrtollstrtod 每行)读取它们并创建自己的比较函数。

您的问题可能是在您的操作系统上,一个文件无法由多个进程打开(在大多数POSIX 系统上这是允许的)。 fopen Sorted.txt 文件 after 运行 sort 命令,或者按照我所说的编码避免运行外部命令(这也是外部依赖项)(读入数组和@ 987654343@ing)

如果处理浮点数,请阅读the floating point guide(即每个程序员都应该了解的浮点运算知识),并注意NaNs。

还要注意&lt;conio.h&gt; 不是标准头文件:我的系统 (Linux) 没有它。你可能不需要它(你可能不需要打电话给getch

如果使用 C++11 编码,您可以使用 std::sort

如果使用SQLite 或一些真正的SQL 数据库(例如PostgreSQL ...),您可以拥有适当的数据库架构并发出适当的SQL 请求(使用SELECT ... ORDER BY .. ..)。不要忘记适当的索引。

【讨论】:

  • 是的,因为与qsort 的比较功能是用户提供的。只需使其适合您的需求
猜你喜欢
  • 1970-01-01
  • 2013-06-06
  • 2020-10-09
  • 2021-09-28
  • 2015-09-13
  • 2018-04-29
  • 2013-02-10
  • 1970-01-01
  • 2013-05-15
相关资源
最近更新 更多