2010-10-12 85 views
1
#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; 
} 

我得到一个写这个文件句柄有什么问题?

分段故障

谢谢。

+2

学会使用调试器 – pm100 2010-10-12 17:54:54

回答

10

我不知道关于C什么,但似乎你写你已经以只读方式打开文件...

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

也许应该是:

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

如果这不是segv,那么您不检查第二个fopen的返回值,因为第一个不会创建它,第二个将会失败,您将拥有一个在fpin中的空指针... – 2010-10-12 15:30:09

4

他们第一我看到的问题是您不检查fopen呼叫的成功。它可能会失败并导致fpin为空,这将导致代码中稍后的问题。

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

最有可能的,一个你fopen呼叫失败和返回NULL。造成这种情况的最有可能的候选者是以下行:

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

你可能意味着在这里使用一个"w",如您稍后尝试写入文件。我猜这个文件还不存在......因此,当你试图用"r"打开它时,fopen调用失败。

3
  1. 更改char c;int c; - fgetc返回一个int。
  2. 检查呼叫的返回值为fopen以查看是否获得NULL返回值。
  3. 将第一个fopen的模式更改为"w",以便您可以写入该文件。
  4. 您可能要考虑在"hello world!"的末尾添加\n
+0

+1:并且我还要加上:5.编译所有警告; 6.如果您提出问题,请更准确地描述错误(在哪一行发生错误...) – 2010-10-12 18:44:01