你如何正确使用fstat()函数及其限制是什么?

时间:2015-02-02 23:29:03

标签: c arrays malloc

所以我对C很新。我用Java做了很多编程,发现很难学习C.

目前我被分配从我们的终端窗口读取一个文件,该窗口将包含一个整数列表。从这个列表中我们必须读取值并计算平均值,我相信我已经正确地完成了这个。

我唯一的问题是我不明白如何正确使用fstat(),我阅读了手册页但我仍然很难理解。在我的下面的代码中,我想使用fstat()来查找正在读取的文件的大小,这样我就可以为我的数组分配正确的空间量,在那里我存储从输入文件中读取的值。我只需要知道fstat()的正确用法和语法,从那里我相信我可以取得重大进展。提前谢谢!

    char *infile;
    int fileSize;
    int fd;
    int i;
    int j;
    int temp;
    int sum = 0;
    int average;
    /* enforce proper number of arguments
    */
    if (argc != 1)
    {
            fprintf(stderr, "Too many arguments.\n");
            exit(1);
    }

    infile = argv[1];

    //open file
    fd = open(infile, O_RDONLY);

    //exit if open fails
    assert (fd > -1);

    //find size of file
    fileSize = fstat(fd, blksize_t st_blksize); 

    //fine perfect size for array
    temp =  malloc(temp * sizeof(int));

    //create file of perfect size
    int intArray[temp];

    //scan integers into our array
    for (i = 0; i < fileSize; i++)
    {
            fscanf(infile, "%d", intArray[i]);
    }
    fclose(fd);

    //add all integers into the array up
    for (j = 0; j < fileSize; j++);
     {
            sum = sum + intArray[j];
     }

    //calculat average
    average = (sum)/fileSize;

    printf("Number of numbers averaged: %d\n Average of numbers: %d\n", fileSize, average);

    if ( close(fd) == -1 )
     {
             fprintf(stderr, "error closing file -- quitting");
             exit(1);
     }

return 0;

}

2 个答案:

答案 0 :(得分:1)

库函数fstat()不返回文件的大小,如果成功则返回0。它通过填写作为参数传递的结构来通知文件大小。

if (fstat( fd, &buf))
    printf("Bad call\n");
else
    printf("File size : %ld\n", buf.st_size);

但是当@chux(已删除帖子)回答时,它会以字节为单位告诉您文件大小,而不是整数。函数fscanf()输入来自 text 的数据,因此文件大小和字段数之间没有直接关联。

很遗憾,在回答您的标题问题时,使用fstat()确定文件大小对您没有用处。您的第二个隐含问题是如何为阵列分配足够的内存。我发布了一个答案,在一个不同的上下文中,一开始数组大小是未知的。 C reading a text file separated by spaces with unbounded word size

但是在这里我使用了一种更简单的技术 - 解析文件两次以找出它包含多少文本整数。然后,它会重新调整文件并为数组分配内存,但在此示例中,数组并不是计算值的总和和平均值所必需的,并且双文件解析也是不必要的,除非你打算用价值观做更多的事情。

#include <stdio.h>
#include <stdlib.h>

void fatal(char *msg) {
    printf("%s\n", msg);
    exit (1);
    }

int main(int argc, char *argv[])
{
    FILE *fil;
    int *array;
    int items = 0;
    int sum = 0;
    int avg;
    int value;
    int i;

    if (argc < 2)                                       // check args
        fatal ("No file name supplied");
    if ((fil = fopen (argv[1], "rt")) == NULL)          // open file
        fatal ("Cannot open file");
    while (fscanf(fil, "%d", &value) == 1)              // count ints
        items++;
    printf ("Found %d items\n", items);
    if (items == 0)
        fatal ("No integers found");
    if ((array = malloc(items * sizeof (int))) == NULL) // allocate array
        fatal ("Cannot allocate memory");

    if (fseek (fil, 0, SEEK_SET))                       // rewind file
        fatal ("Cannot rewind file");
    for (i=0; i<items; i++) {
        if (fscanf(fil, "%d", &value) != 1)             // check int read
            fatal ("Cannot read integer");
        array[i] = value;
        sum += value;
    }
    fclose(fil);
    printf ("Sum = %d\n", sum);
    printf ("Avg = %d\n", (sum+items/2) / items);       // allow rounding
    free(array);
    return 0;
}

输入文件:

1 2   3
4 5
6
   -1   -2

节目输出:

Found 8 items
Sum = 18
Avg = 2

答案 1 :(得分:1)

您声称已阅读fstat()的联机帮助页,这与以下内容不一致:
fileSize = fstat(fd, blksize_t st_blksize);
您需要在函数范围中声明struct stat,并将指针传递给fstat()

struct stat finfo;
fstat(fd, &finfo);

然后您可以从struct stat

中读取文件大小
off_t filesize = finfo.st_size;

我还建议您使用size_t代替int来处理对象大小。