gpt4 book ai didi

c - 如何将外部文件中的数据导入到我的程序中

转载 作者:行者123 更新时间:2023-11-30 15:32:38 24 4
gpt4 key购买 nike

我正在尝试以 FIFO 方式实现页面替换算法。

因为看起来输入至少必须是数千个整数,所以我做到了在文本格式的文件中(例如 tr.inp/1 20 603 20 26000 2401 201 20 603 ...)但是我在这里遇到了一个问题...我不知道如何将这些数字导入到我的程序中以便 FIFO 算法可以读取它们并且计算出有多少页错误。我尝试通过在 main() 中的 argc、argv 中获取参数来实现此目的,但仅此而已。我在代码中标记了我花了大部分时间在代码中来解决它的地方。我能做什么?

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

#define MAX_SIZE 500000

int fifo();

int refArr[MAX_SIZE];
int str[10];
int tmp[10];
char *chk;
int pgFault_number;
int i, j;
FILE *fp;

int main(int argc, char *argv[])
{
if(argc!=2)
{
perror("<Usage> $fifo file_name.ip");
exit(1);
}

fp=fopen(&argv[1], "rt");
if(fp==NULL)
{
perror("An error occured while opening the file...");
exit(1);
}
//From here
while(1)
{
chk=fgets(str, sizeof(str), fp);
if(chk==NULL)
break;
str[strlen(str)-1]='\0';

str
//To here

pgFault_number=fifo();

printf("\n no of page faults is : %d",pgFault_number);

fclose(fp);

return 0;
}

int fifo(integers from text file..)
{
TBD
}

<This is the contents of file> there're 50,000 integers in file.
...
1624
1624
1625
1625
1626
1626
1627
1627
1628
1628
1629
1629
1024
1025
1630
1630
896
897
1631
1631
768
769
640
641
1632
1632
512
513
128
129
384
385
...

最佳答案

由于您有许多整数要读取并且事先不知道有多少,因此我建议动态地为整数列表分配存储空间。您的输入似乎未格式化,因此 Austin Mullins 使用 fscanf 的建议很好。

这是一个从具有给定文件名的文件中读取整数的函数。它返回一个新分配的整数数组,并将其长度写入 *len(如果给定):

int *read_ints_new(const char *fn, int *len)
{
FILE *f = fopen(fn, "r");
int *arr = NULL;
int size = 0;
int n = 0;

if (f == NULL) return NULL;

for (;;) {
int res, x = 0;

res = fscanf(f, "%d", &x);

if (res == EOF) break;
if (res == 0) fscanf(f, "%*s");
if (res == 1) {
if (n >= size) {
size = size ? 2 * size : 64;
arr = realloc(arr, size * sizeof(*arr));
if (arr == NULL) {
n = 0;
break;
}
}
arr[n++] = x;
}
}
fclose(f);

arr = realloc(arr, n * sizeof(*arr));

if (len) *len = n;
return arr;
}

该函数连续分配更大的内存块,以便容纳所有读取的整数。最后,分配所需的确切内存量,以免浪费空间。

fscanf 尝试解析和转换整数。如果成功,则返回 1,即进行的转换次数。如果到达文件末尾,则返回EOF。如果出现解析错误(因为数据的下一个字不是整数),它将返回 0 并将文件指针重置到尝试解析数字之前离开的位置。因此,我们必须吃掉下一个单词(不存储它,这就是“%*s”中星号的用途),以便跳过非数字条目。

您可以像这样使用这个函数:

int *array;
int n, i;

array = read_ints_new("file.txt", &n);
if (array == NULL) return 1;

printf("%d entries:\n", n);

for (i = 0; i < n; i++) {
if (i) printf(", ");
printf("%d", array[i]);
}
printf("\n");

free(array);

使用完分配的数组后记得用free释放它。

关于c - 如何将外部文件中的数据导入到我的程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24122201/

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