【问题标题】:sorting a text file in c and file handling在 c 中对文本文件进行排序和文件处理
【发布时间】:2014-12-08 14:10:07
【问题描述】:

从输入文件中读取数字。然后使用任何排序算法对它们进行排序。然后最后在另一个文本文件中打印排序后的数字。我已经尝试了以下代码,但它没有在另一个文件中显示输出。

#include "s.h";

#include<stdio.h>

int main(int argc, char *argv[])

{

    int *a,num,i;

    FILE *fp,*ft;

    char s[5];

    fp=fopen("input.txt","r");

    sscanf(argv[1],"%d",&num);

    printf("%d\n",num);

    a=(int *)malloc(num*sizeof(int));

    for(i=0;i<num;i++)

    {

        fgets(s,10,fp);

        sscanf(s,"%d",a+i);

    }

    selection(a,num);

    fclose(fp);

    free(a);

    ft=fopen("output.txt","w");

    for(i=0;i<num;i++)

    {

        fprintf(ft,"%d",*(a+i));

        fputs(s,ft);

        fputs("\n",ft);

    }

    fclose(ft);

    return 0;

}

【问题讨论】:

  • 开始,检查fopen是否成功

标签: c


【解决方案1】:

在将a 写入output.txt 之前,您正在释放它!

你的程序的结尾应该是:

    ...
    fclose(fp);
    /* free(a); too early, still need to be written */
    ft=fopen("output.txt","w");
    for(i=0;i<num;i++)
    {
        fprintf(ft,"%d",*(a+i));
        fputs(s,ft);
        fputs("\n",ft);
    }
    fclose(ft);
    free(a);
    return 0;
}

但你也应该:

  • 测试fopen两者的结果
  • 测试所有scanf的结果
  • 测试fgets的结果

规则是:始终控制自己没有生产的东西

【讨论】:

  • 仍然没有得到答案。
  • @kunal51:它在我的测试中有效——即使输出很丑(fputs(s, ft) 是什么意思?),如果我不得不注释掉selection(a) 调用(来源在哪里? )。如果您需要更多帮助,请显示input.txtselection 的来源以及您如何调用您的程序。
【解决方案2】:

分段错误可能有多种原因,但最重要的是,

  1. 在您的代码中,首先您调用free(a);,然后您尝试通过fprintf(ft,"%d",*(a+i)); 访问free-d 内存。将free(a); 放在return 0; 语句之前。

  2. 您没有检查fopen()s 是否成功。如果fopen() 失败,那么您最终将访问NULL 指针。

  3. 您没有执行NULL 检查argv[1]

  4. 您正在尝试将 10 元素 [如果可用] 复制到仅具有 5 空间的缓冲区。将fgets(s,10,fp); 更改为fgets(s,5,fp);

  5. 不要忘记#include &lt;stdlib.h&gt;malloc()。另外,检查malloc() 的成功/失败。

注意:请do not castmalloc()的返回值。

另外,我们不知道selection(a,num);内部发生了什么

【讨论】:

  • 假设你在linux上,你能用-gflag编译你的代码,然后运行usegdb并告诉我们分段错误的位置吗?
猜你喜欢
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 2013-03-16
  • 1970-01-01
  • 2021-09-28
相关资源
最近更新 更多