#include <stdio.h>

int main(void){

    FILE *ptr;
    ptr = fopen("example.txt", "r");
    if (ptr == NULL){
        printf("File not opened or found");
        return 1;
    }
    
    char str[20];
    fgets(str, sizeof(str), ptr);
    printf("Read text from example.txt is: %s\n", str);

    return 0;
}

我刚接触C语言,我对C中的基本文件访问逻辑感到非常困惑,我的第一个问题是,为什么fgets()函数接受ptr而不是*ptr作为第三个参数?为什么是FILE struct 的地址,而不是它引用的内容? 当我运行代码时,我总是在if主体中得到错误,我运行的是一台Windows计算机,无法让我的C代码使用fopen()函数来检索example.txt.任何帮助都将不胜感激.

推荐答案

<stdio.h>中声明的用于处理文件等的标准流函数使用指向由库分配的不透明FILE struct 的指针.实现的细节对库是私有的,所有程序需要的是fopen()freopen()返回的FILE个指针,并作为参数传递给输入和输出函数.

库函数适当地更新FILE struct 以实现缓冲方案和其他翻译功能.如果直接传递FILE struct ,则不能更新它,因为C中的 struct 是按值传递的,因此库函数将只接收 struct 的副本,并且函数一返回,任何更新都将丢失.

这种方法非常通用,许多编程语言都在幕后使用它.Java对象通常作为指向方法的指针传递.对于javascript对象和数组也是如此.在C++中接收对象引用的函数基本上会得到保证不为空的指针.在这些情况下,通过.运算符访问对象属性将被转换为指针取消引用,并进行一些或不进行额外的运行时判断和查找.

在您的示例中,您说文件无法打开:生成信息量更大的错误消息是帮助跟踪此类故障的好习惯.该文件无法打开,可能是因为它在运行时不在当前目录中.

您还应该判断fgets()中的潜在故障,并用fclose()关闭流.

#include <errno.h>
#include <stdio.h>
#include <string.h>

int main(void) {
    FILE *ptr = fopen("example.txt", "r");
    if (ptr == NULL) {
        fprintf(stderr, "Cannot open example.txt: %s\n", strerror(errno));
        return 1;
    }
    
    char str[100];
    if (fgets(str, sizeof(str), ptr)) {
        printf("Read text from example.txt is: %s\n", str);
    } else {
        printf("Cannot read from example.txt: %s\n", 
               ferror(ptr) ? "read error" : "empty file");
    }
    fclose(ptr);
    return 0;
}

C++相关问答推荐

带双指针的2D数组

C指针算法在函数参数中的应用

va_copy的使用是未定义的行为吗?

SDL 2.0-从数组渲染纹理

有没有可能我不能打印?(C,流程)

struct 上的OpenMP缩减

如何在CANbus RX/TX FIFO起始地址寄存器(ATSAME 51)的特定地址初始化数组?

预处理器宏扩展(ISO/IEC 9899:1999(E)§;6.10.3.5示例3)

在vfork()之后,链接器如何在不 destruct 父内存的情况下解析execve()?

将数组插入数组

GCC错误,共享内存未定义引用?

`预期说明符-限定符-列表在‘(三元运算符中的’token`‘之前

C:Assignment中的链表赋值从指针目标类型中丢弃‘const’限定符

在运行时判断C/C++指针是否指向只读内存(在Linux操作系统中)

为什么二进制文件的大小不会随着静态数据的大小而增加?

与外部SPI闪存通信时是否应禁用中断?

在下面的C程序中,.Ap0是如何解释的?

如何在C中处理流水线中的a、n命令?

为什么一个在线编译器拒绝这个VLA代码,而本地的Apple clang却不拒绝;t?

分支预测和UB(未定义的行为)