打开不带扩展名的文件

Open file without extension

我需要使用 fopen() 系统调用在 /proc/ 文件夹中打开一个没有扩展名的文件,不幸的是它不起作用。

这是代码

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

int main(void){
    FILE *f;
    int size;

    //open /proc/meminfo
    f = fopen("/proc/meminfo", "r");
    printf("errno after open: %s\n", strerror(errno)); //errno = Success

    //create buffer
    fseek(f,0,SEEK_END);
    size = ftell(f);
    printf("size: %d\n", size);
    char buffer[size];
    bzero(buffer,size);
    fseek(f,0,SEEK_SET);

    //fill the buffer and print
    fread(buffer,sizeof(char),size,f);
    printf("%s\n", buffer);

    return 0;
}

问题是size=0,errno是"Success",所以文件打开了也没有读到

你有什么想法吗?

提前致谢!

/proc 中的某些(大多数?)文件大小为 0,因为它们的内容是在读取时动态生成的。因此,将 EOF 作为普通文件读取以获取内容。这有效:

#include <stdio.h>

int main(void){
    FILE *f;
    int c;

    f = fopen("/proc/meminfo", "r");

    if (!f) {
        return -1;
    }

    while ( (c = fgetc(f)) != EOF) {
        printf("%c",c);
    }

    return 0;
}

文件的扩展名根本不重要。

您的代码中有几个问题: 1. 您没有测试 fopen 的 return 值。来自联机帮助页:

RETURN VALUE

Upon successful completion fopen(), fdopen() and freopen() return a FILE pointer. Otherwise, NULL is returned and errno is set to indicate the error.

  1. 你的缓冲区分配错误

不能用变量分配char数组。所以你必须改变:

char buffer[size];

通过:

#define BUFFER_SIZE 512
char buffer[BUFFER_SIZE];

或动态

char* buffer = malloc(sizeof(char) * size);
if (buffer == NULL)
  return 1;

(当然你可以改进这个片段)。也别忘了最后free缓冲。

  1. 不是真正的错误,但您不需要用整个文件填充缓冲区。您可以只读取文件 "lines by lines",或者至少按字节读取(例如 BUFFER_SIZE),然后只存储您需要的内容。

希望对您有所帮助。