【问题标题】:Whats wrong with the writing to this file handle?写入此文件句柄有什么问题?
【发布时间】:2010-10-12 15:24:24
【问题描述】:
#include<stdio.h>
#include<ctype.h>

int main() {

    FILE *fpin = fopen("in.txt", "r");
    fprintf(fpin, "hello, world!");
    fclose (fpin);

    char c;
    fpin = fopen("in.txt", "r");
    FILE *fpout = fopen("out.txt", "w");
    while ((c = fgetc(fpin)) != EOF) {
        fputc (toupper(c), fpout);
    }

    fclose (fpout);
    fclose (fpin);
    return 0;
}

我得到了一个

分段错误

谢谢。

【问题讨论】:

    标签: c file-io segmentation-fault


    【解决方案1】:

    我对C一无所知,但似乎你写入了一个你以只读方式打开的文件......

    FILE *fpin = fopen("in.txt", "r"); 
    fprintf(fpin, "hello, world!"); 
    

    应该是:

    FILE *fpin = fopen("in.txt", "w"); 
    fprintf(fpin, "hello, world!"); 
    

    【讨论】:

    • 如果那不是 segv,那么您就不会检查第二个 fopen 的返回值,因此由于第一个 fopen 没有创建它,第二个将失败并且您将在其中有一个 NULL 指针fpin...
    【解决方案2】:

    我看到的第一个问题是您没有检查fopen 调用是否成功。它可能会失败并导致 fpin 为 NULL,这将导致后面的代码出现问题。

    FILE *fpin = fopen("in.txt", "r"); 
    if (!fpin) { 
      printf("Error opening in.txt");
      return EXIT_FAILURE;
    }
    

    【讨论】:

      【解决方案3】:
      1. 将您的 char c; 更改为 int c; -- fgetc 返回一个 int。
      2. 检查对fopen 的调用的返回值,看看是否返回NULL。
      3. 将第一个fopen的模式更改为"w",以便您可以写入文件。
      4. 您可能需要考虑在"hello world!" 的末尾添加一个\n

      【讨论】:

      • +1:我还要补充一点: 5. 编译时打开所有警告; 6.如果您对 SO 提出问题,请更准确地描述错误(您的错误发生在哪一行...)
      【解决方案4】:

      很可能,您的一个fopen 调用失败并返回NULL。最可能的候选者是以下行:

      FILE *fpin = fopen("in.txt", "r");
      

      您可能打算在这里使用"w",因为您稍后会尝试写入文件。我猜该文件还不存在……因此,当您尝试使用"r" 打开它时,fopen 调用失败。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-23
        • 1970-01-01
        • 2011-01-28
        • 2015-09-17
        • 2012-04-14
        • 1970-01-01
        相关资源
        最近更新 更多