2

我正在为我参加的一门课程完成一个编程项目,我正在努力解决我认为只是对 C 编程的基本误解,并希望 SO 能有所帮助。我正在尝试使用这段代码打开一个文件:

FILE *fp;
if(fp = fopen("testfile.txt", "r") == NULL){
    perror("fileopen");
}

当我尝试编译该代码时,我收到此警告:警告:赋值从整数中生成指针而无需强制转换

然后,当我尝试读取文件时,我遇到了分段错误。

我是一位经验丰富的 java 程序员,但我只是不明白 C 中的指针和数据类型。

谢谢!

4

3 回答 3

2

其他人已经指出,事情出了问题if。为避免这种情况,请拆分事物。它将更具可读性且不易出错:

FILE *fp;
fp = fopen("testfile.txt", "r");
if(fp  == NULL) {
    perror("fileopen");
}

或者,你看到的很多:

FILE *fp;
fp = fopen("testfile.txt", "r");
if(!fp) {
    perror("fileopen");
}
于 2013-09-25T14:08:51.977 回答
1

问题是对运算符优先级的误解。fopen("testfile.txt", "r") == NULL首先评估,结果(1 或 0)存储在指针中,fp而不是fopen("testfile.txt", "r").

你应该 (fp = fopen("testfile.txt", "r")) == NULL在你的 if 语句中实际使用。或者,如果您刚刚开始,最好将其分解一下并编写:

FILE *fp = fopen("testfile.txt", "r");
if(fp == NULL){
    perror("fileopen");
}
于 2013-09-25T14:06:31.877 回答
1

您缺少一对括号:

(fp = fopen("testfile.txt", "r") == NULL)

被解析为

(fp = (fopen("testfile.txt", "r") == NULL))

它评估比较,给出一个int,然后将其存储在一个指针值变量中,因此是警告。

它应该是

((fp = fopen("testfile.txt", "r")) == NULL)
于 2013-09-25T14:06:53.990 回答