【问题标题】:How to import data from external file into my program如何将外部文件中的数据导入我的程序
【发布时间】:2014-06-09 14:16:30
【问题描述】:

我正在尝试以 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
...

【问题讨论】:

  • 很难理解您的实际问题是什么。你想知道如何在不知道有多少的情况下从文件中读取所有整数吗?您的文件看起来如何?您能否逐字发布摘录,即使用 {code} 样式?
  • @MOehm 对不起,如果我把你弄糊涂了。我想知道的是如何从文件中获取所有整数(我在文本文件中有 50K 整数。)并按字面意思使用它们。
  • 听起来你可能想要fscanf 和/或atoi。我始终保持对cplusplus.com/reference/clibrary 的标签打开。

标签: c


【解决方案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分配的数组。

【讨论】:

  • 感谢您对我的东西的补充 cmets,这肯定给了我一些想法。有了你的材料,我让自己考虑了一段时间。
【解决方案2】:

我会使用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中。

【讨论】:

  • 感谢您的帮助。在我用你的 cmets 弄清楚之后,我似乎没有努力搜索……真可惜。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 2019-03-23
  • 1970-01-01
相关资源
最近更新 更多