gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:00:10 25 4
gpt4 key购买 nike

所以我对 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;

最佳答案

库函数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

但在这里我使用了一种更简单的技术——解析文件两次以找出它包含多少文本整数。然后它倒带文件并为数组分配内存,尽管在这个例子中,数组不是计算值的总和和平均值所必需的,而且双重文件解析也不是必需的,除非你打算这样做更多的值(value)观。

#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

关于c - 您如何正确使用 fstat() 函数及其限制是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28288775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com