【问题标题】:Open file without extension打开没有扩展名的文件
【发布时间】:2015-03-06 14:25:21
【问题描述】:

我需要使用 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”,所以即使打开了也读不到文件。

你有什么想法吗?

提前致谢!

【问题讨论】:

  • 请检查f文件打开的结果。该文件必须具有准确的文件名,并以完整路径名或可用路径的形式存在。
  • 你确定这是你的程序吗?包含文件应该是#include &lt;string.h&gt;。更正后,我得到输出errno after open: No such file or directory
  • 当然,我刚才写了上面的程序来试试。用字符串标题修复我有相同的结果。 fopen() 的结果是一个指针,我已经检查过了。编辑:我认为这不是路径名问题,尝试使用 /boot/memtest86+.bin 它可以工作,唯一的区别是路径名末尾的扩展名
  • 也许那个文件(没有扩展名)确实存在并且它的大小是 0。大概你确实检查了f!=NULL,在所有文件打开操作之后必不可少?
  • ls -la /proc/meminfo ?

标签: c linux unix ubuntu


【解决方案1】:

/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;
}

【讨论】:

    【解决方案2】:

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

    您的代码中有几个问题: 1.你没有测试fopen的返回值。从手册页:

    返回值

    fopen()、fdopen() 和 freopen() 成功完成后返回一个 FILE 指针。否则,返回 NULL 并设置 errno 以指示错误。

    1. 缓冲区分配错误

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

    char buffer[size];
    

    通过:

    #define BUFFER_SIZE 512
    char buffer[BUFFER_SIZE];
    

    或动态

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

    (当然你可以改进这个sn-p)。最后别忘了free缓冲。

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

    希望这会有所帮助。

    【讨论】:

    • 你的 #2 在更现代的 C 版本中已经被克服。
    • 所有的好东西,但这并不能解决他的问题。根本原因是您无法获取/proc 中的文件大小。见this answer
    • 确实是@SamProtsenko,所以应该使用#3 :)
    • 非常感谢!维克多的解决方案是有效的,我没想到他的解决方案! ;) 感谢其他提示!
    猜你喜欢
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2023-04-09
    • 1970-01-01
    • 2018-10-12
    • 2019-08-27
    相关资源
    最近更新 更多