所以我对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;
}
答案 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
来处理对象大小。