我试图以FIFO方式实现页面替换算法。
因为看起来输入必须至少成千上万的整数,所以我做到了 在文本格式的文件中 (例如tr.inp / 1 20 603 20 26000 2401 201 20 603 ...)但我在这里遇到了一个问题...我不知道如何将这些数字导入我的程序,以便FIFO算法可以读取他们并弄清楚有多少页面错误。我试图通过在argc中获取参数来解决这个问题,在main()中获取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
...
答案 0 :(得分:1)
由于你有很多整数要读,而且事先并不知道有多少,我建议动态地为整数列表分配存储空间。您的输入似乎未格式化,因此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
释放已分配的数组。
答案 1 :(得分:0)
我会使用fscanf
而不是fgets
来自动从文件中获取整数值,而不必担心临时字符串缓冲区。
int read_value = 0, read_count = 0, pgFault_number = 0;
while(1)
{
read_count = fscanf(fp, "%d", &read_value);
if(read_count==EOF)
break;
refArr[pgFault_number++] = read_value;
}
然后,数字计数已存储在pgFault_number
。