打开无扩展名的文件

时间:2015-03-06 14:25:22

标签: c linux unix ubuntu

我需要使用fopen()sys调用在/ 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”,因此,即使文件被打开,也不会读取文件。

你有什么想法吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

/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 :(得分:0)

文件的扩展名无关紧要。

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

  

返回值

     

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

  1. 缓冲区的分配错误
  2. 您无法使用变量分配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. 不是真的错误,但您不需要用整个文件填充缓冲区。您可以只读取“逐行”文件,或者至少每个字节读取一次(例如BUFFER_SIZE)并存储您需要的文件。
    2. 希望这有帮助。