如何从输入文件中提取信息并将它们放在C中的数组中?

时间:2016-10-26 13:05:53

标签: c arrays file io

我有一个input.txt文件:

  • 第一行:m以及以下m行,我有两对数an

我必须计算一个^ n,结果最多可以有10 ^ 8位数。我使用数组创建了程序,并为an提供了值。它返回了正确的答案。但我要做的是从文件中读取信息,计算^ n并在output.txt文件中写入数字。

示例:

在input.txt中,我在第一行

2
2 10
1 100000

output.txt的

1024
1

正如我所说,该程序适用于我在主程序中编写的任何数字。现在我需要帮助从input.txt中提取数字,将它们放在数组中,然后我计算它们以在output.txt中返回它们。

从codepad.org

复制的非编译代码
#include <stdio.h>
#include <stdlib.h>

const int MAX_NR_DIGITS = 10000;

void longNumClone(char *from, char *to)
{
    int i;
    for (i = 0; i < MAX_NR_DIGITS; i++)
        to[i] = from[i];
}

void longNumPrint(char *num, int sizeNum) {
    int i;
    for (i = sizeNum-1; i >= 0; i--) {
        printf("%i", num[i]);
    }
}

int longNumDiv2(char *rez, char *num, int sizeNum) {
    int i;
    num[sizeNum] = 0;
    rez[sizeNum] = 0;

    for (i = sizeNum - 1; i >= 0; i--) {
        rez[i] = ((num[i+1] - rez[i+1]*2) * 10 + num[i]) / 2;
    }

    if (rez[sizeNum - 1] == 0) {
        return sizeNum - 1;
    }
    return sizeNum;
}

int multiply(char *rez, char *a, int sizeA, char *b, int sizeB) {
    int sizeRez = 0, i;
    for (i = 0; i < MAX_NR_DIGITS; i++) {
        rez[i] = 0;
    }

    int temp = 0, j;
    for (i = 0; i < sizeB; i++) {
        for (j = 0; j < sizeA; j++) {
            temp = b[i] * a[j];

            int inc = 0;
            do {
                temp = temp + rez[i + j + inc];
                rez[i + j + inc] = temp % 10;
                if (i + j + inc + 1 > sizeRez) {
                    sizeRez = i + j + inc + 1;
                }
                temp = temp / 10;
                inc++;
            }while (temp != 0);
        }
    }

    return sizeRez;
}

int superpow(char *rez, char *base, int sizeBase, char *exp, int sizeExp) {
    int i;
    char temp[MAX_NR_DIGITS];
    char temp1[MAX_NR_DIGITS];
    char temp2[MAX_NR_DIGITS];

    for (i = 0; i < MAX_NR_DIGITS; i++) {
        rez[i] = 0;
    }

    int sizeRez = 1;
    rez[0] = 1;

    while (sizeExp > 0) {
        if (exp[0] & 1) {
            longNumClone(rez, temp);
            sizeRez = multiply(rez, temp, sizeRez, base, sizeBase);
        }

        longNumClone(exp, temp);
        sizeExp = longNumDiv2(exp, temp, sizeExp);

        longNumClone(base, temp1);
        longNumClone(base, temp2);
        sizeBase = multiply(base, temp1, sizeBase, temp2, sizeBase);

          }

    return sizeRez;
}

int main() {

    // 4437053125^625
    char a[MAX_NR_DIGITS] = {5, 2, 1, 3, 5, 0, 7, 3, 4, 4};
    int sizeA = 10;
    char n[MAX_NR_DIGITS] = {5, 2, 6};
    int sizeN = 3;

      char rez[MAX_NR_DIGITS];
    int sizeRez = 0;


    sizeRez = superpow(rez, a, sizeA, n, sizeN);
    longNumPrint(rez, sizeRez);

    return 0;
}

main()中的数组被视为可变长度数组(VLA),因为MAX_NR_DIGITS不被视为整数常量表达式,并且您无法初始化VLA。它可以在C ++中使用,但不能在C语言中使用。

1 个答案:

答案 0 :(得分:0)

查看fscanf从文件中读取某种格式,并fprintf将某种格式写入文件。

一些初始化FILE *read_fileFILE *write_file的示例可能是

int count, int a, n;
fscanf(read_file, "%d ", &count);

for (i = 0; i < count; i++) {
    fscanf(read_file, "%d %d ", &a, &n);
    ... 
    /* calculate the output result */
    ...
    fprintf(write_file, "%d\n", result);
}