首页 > 解决方案 > 将 2 列双精度的 .txt 转换为 2 个数组并读取它们

问题描述

我有一个由两列浮点数组成的 .txt 文件。第一列包含变量 A 的值,第二列包含变量 B。

1.0 2.0

1.0 3.0

[ROWS 之间没有空格,我不得不在这里这样写,否则它不会显示出来。]

我必须使用这些数字来求解 C 的这个方程:

A_{j} + B_{j+1}(X) = C

Aj = A 的第 j 项(也称为第 j 行项),j+1 将是之后的项。

我想浏览整个文本文件,以获取不同的 j。让我们假设 j 上升到 10,所以 .txt 中有 10 行。

int j;
for (j = 0; j < 10; j++){
  C = A[j] + B[j+1]*X;

如您所见,我的计划是将这些列转换为两个数组。1 代表 A,1 代表 B。

如果我读到这样的文字:

void readAB(double *A, double *B) {
    FILE *infile;
    
    if(2!=fscanf(infile,"%lf %lf", A, B)) {
        printf("Error\n");
        exit(1);
        
    }
    fclose(infile);
}

到目前为止我所知道的就是像这样调用 int_main :

double A;
double B;
readAB(&A,&B);

但是我该如何称呼它,将它转换成一个数组以供以后使用呢?

标签: c

解决方案


让它动态完成(即,如果你不知道文本文件有多少行)

#define MALLOC_STEP     32
#define MAXLINE         256

typedef struct
{
    size_t datapos;
    size_t buffsize;
    double data[];
}data_t;

int myrealloc(data_t **data)
{
    if(!*data || !(*data) -> buffsize || ((*data) -> datapos == (*data) -> buffsize - 1))
    {
        size_t newbuffsize = !*data ? MALLOC_STEP : (*data) -> buffsize + MALLOC_STEP;
        data_t *tmpbuff = realloc(*data, sizeof(**data) + newbuffsize * sizeof((*data) -> data[0]));
        if(!tmpbuff) return -1;
        if(newbuffsize == MALLOC_STEP) tmpbuff -> datapos = 0;
        tmpbuff -> buffsize = newbuffsize;
        *data = tmpbuff;
    }
    return 0;
}

int readNext(FILE *fp, data_t **data1, data_t **data2)
{
    char line[MAXLINE];

    if(fgets(line, MAXLINE, fp) == NULL) return -1;
    if(myrealloc(data1) || myrealloc(data2)) return 1;
    if(sscanf(line, "%lf %lf", &((*data1) -> data[(*data1) -> datapos]), &((*data2) -> data[(*data2) -> datapos])) != 2) return -1;
    (*data1) -> datapos++;
    (*data2) -> datapos++;
    return 0;
}


int main()
{
    data_t *arr1 = NULL, *arr2 = NULL;
    FILE *fp = fopen("test.txt", "w");
    int result;

    // create test data
    if(fp)
    {
        fprintf(fp, "34563.5674  5654634.233445\n");
        fprintf(fp, "34563.5674e-45  5654634.233445e1\n");
        fprintf(fp, "34563.5674e45  5654634.233445\n");
        fprintf(fp, "34563.5674e10  5654634.233445e3\n");

        fclose(fp);
    }
    fp = fopen("test.txt", "r");

    if(fp)
    {
        do
        {
            result = readNext(fp, &arr1, &arr2);
        }while(!result);

        printf("Datapos %u, Out numbers are:\n", arr1 -> datapos);
        for(size_t index = 0; index < arr1 -> datapos; index++)
        {
            printf("row %04u arr1 = %lg, \t\tarr2 = %lg\n", index, arr1 -> data[index], arr2 -> data[index]);
            fflush(stdout);
        }
    }
}

你可以自己轻松玩https://godbolt.org/z/9giuWS


推荐阅读