Как я могу суммировать столбцы разных файлов в C? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть 8 файлов (файл% d-% d.dat) каждый с 2 ​​столбцами и 1000 строк:

 File1-1     File1-2    File1-3     File1-4
 x1a y1a     x1b y1b    x1c y1c     x1d y1d 
 x2a y2a     x2b y2b    x2c y2c     x2d y2d
 x3a y3a     x3b y3b    x3c y3c     x3d y3d
 .           .          .           .
 .           .          .           .


 File2-1     File2-2    File2-3     File2-4   
 x1e y1e     x1f y1f    x1g y1g     x1h y1h 
 x2e y2e     x2f y2f    x2g y2g     x2h y2h
 x3e y3e     x3f y3f    x3g y3g     x3h y3h
 .           .          .           .
 .           .          .           .

Я хочу суммировать второй столбец каждого файла Файл% d-1 строкапо строке и записать сумму в новый файл: Filesum1;то же самое для файла% d-2 и т. д., т. е.

Filesum1                           Filesum2                and so on  ..
x1a+x1e     y1a+y1e                 x1b+x1f   y1b+y1f           .
x2a+x3e     y2a+y2e                 x2b+x2f   y2b+y2f           .
.           .                       .         .
.           .                       .         .                 . 

Я создал 4 новых файла:

#include <stdio.h>
int main(void)  
{          
int numfiles=4;
int numfileread=8;
int i,yy1, yy2, x0, x1;

FILE *files[numfiles];
FILE *f[numfileread];

for (int n = 0; n < 4; n++)
{
    char filename[4];
    sprintf(filename, "filesum%d.dat", n);
    files[n] = fopen(filename, "w");
}

Тогда я попробовал это, но он работает неправильно:

for (int n = 0; n < 4; n++)
{
   yy1=0;
   yy2=0;
   for(int r=1;r<4;r++)
   {
       char file[8];
       sprintf(file, "file%d-%d.dat", r, n);
       f[i] = fopen(file, "r");
       fscanf(f," %d  %d",&x0,&x1);
       yy1+=x0;
       yy2+=x1;
       fclose(f);
       i++;
   }
   fprintf(files,"%d %d\n",yy1, yy2);
   fclose(files);
}

Если у меня было такое же назначение, но для чтения 50 файлов:

readFile1, readFile2, readFile3, ......., readFile50

Как я могу изменить код?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Хорошо, у вас есть большое количество файлов, и вы хотите суммировать два столбца данных по этим файлам.Вы также знаете, что у вас будет 1000 строк данных в каждом файле.Вы можете попытаться сохранить все файлы открытыми с помощью массива файловых дескрипторов и читать их по очереди, но это слишком сложно.Вместо этого:

  • определить массив для каждого столбца и инициализировать его нулем;
  • открывать по одному файлу за раз, читать данные, добавлять его в массив и закрывать этот файл;
  • записать суммированные данные в файл результатов.

В этом решении всегда будет не более одного открытого файла.

Код будет выглядеть следующим образом:

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

enum {
    nData = 1000,       // number of rows
    nFiles = 50,        // number of files per block
    nBlocks = 4         // number of blocks
                        // nomenclature: file{file}-{block}.dat
};

int main(void)
{
    for (int j = 0; j < nBlocks; j++) {
        double col1[nData] = {0.0};
        double col2[nData] = {0.0};

        char outn[32];
        FILE *out;

        for (int i = 0; i < nFiles; i++) {
            char fn[32];
            FILE *f;

            snprintf(fn, sizeof(fn), "file%d-%d.dat", i, j);

            f = fopen(fn, "r");
            if (f == NULL) {
                fprintf(stderr, "Could not open '%s'.\n", fn);
                exit(1);
            }

            for (int k = 0; k < nData; k++) {
                char line[80];
                double x, y;

                if (fgets(line, sizeof(line), stdin) == NULL) break;
                if (sscanf(line, "%lf %lf", &x, &y) != 2) continue;

                col1[k] += x;
                col2[k] += y;
            }

            fclose(f);
        }

        snprintf(outn, sizeof(outn), "filesum-%d.dat", j);

        out = fopen(outn, "r");
        if (out == NULL) {
            fprintf(stderr, "Could not write to '%s'.\n", outn);
            exit(1);
        }

        for (int k = 0; k < nData; k++) {
            fprintf(out, " %15g %15g\n", col1[k], col2[k]);
        }

        fclose(out);        
    }

    return 0;
}

Сезон по вкусу.

0 голосов
/ 19 февраля 2019

Существует несколько проблем:

  1. Этот цикл будет выполняться только три раза, я думаю, вы намеревались запустить его 4 раза.

    for (int r = 1;r <4; r ++) </p>

  2. В массиве символов file недостаточно места для хранения строки "file%d-%d.dat"

  3. fclose(f); потребностидля изменения на fclose(f[i]);

  4. Необходимо указать индекс для files.

    fprintf(files,"%d %d\n",yy1, yy2);

Это то, что я придумал.Вы можете попробовать это.

#include <stdio.h>

int main(){
        FILE *readFile1;
        FILE *readFile2;
        FILE *writeFile;
        char inFile1[32] = {0};
        char inFile2[32] = {0};
        char sumFile[32] = {0};
        int i,xa,xb,ya,yb;
        int ret1;ret2;
        for(i=0;i<4;i++){
                sprintf(inFile1, "File1-%d", i); 
                sprintf(inFile2, "File2-%d", i); 
                sprintf(sumFile, "sumFile%d", i); 
                readFile1 = fopen(inFile1, "r");
                readFile2 = fopen(inFile2, "r");
                writeFile = fopen(sumFile, "w");
                while(1){
                        ret1 = fscanf(readFile1, "%d %d", &xa, &ya);
                        ret2 = fscanf(readFile2, "%d %d", &xb, &yb);
                        if( (ret1 != 2) || (ret2 != 2) )
                                break;
                        fprintf(writeFile, "%d %d", xa+xb, ya+yb);
                }   
                fclose(readFile1);
                fclose(readFile2);
                fclose(writeFile);
        }   
        return 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...