2011年8月4日木曜日

メモ:fscanfの使い方

これは異なるファイル(a2.*)から異なるサイズの配列を読み込むためのコードだが、この中で引っかかったのがfscanfの使い方である。

fscanf(読み込むファイルポインタ, 書式[変数の型?], 格納する変数)みたいな使い方をする。
書式に%dを指定すればファイルの中のint型の要素を読み込む。%lfを指定すればdouble型の要素を読み込む。


#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>

int main(int argc, char **argv){
 int i;
 int PeTot, MyRank;
 MPI_Comm SolverComm;
 double *vec, *vec2, *vecg;
 int *Count, *CountIndex;
 int num;
 double sum0, sum;
 char filename[80];
 FILE *fp;

 MPI_Init(&argc, &argv);
 MPI_Comm_size(MPI_COMM_WORLD, &PeTot);
 MPI_Comm_rank(MPI_COMM_WORLD, &MyRank);

 sprintf(filename, "a2.%d", MyRank);
 fp = fopen(filename, "r");
 assert(fp != NULL);

 fscanf(fp, "%d", &num);
 vec = malloc(num * sizeof(double));
 for(i=0;i<num;i++){
  fscanf(fp, "%lf", &vec[i]);
 }

 for(i=0;i<num;i++){
  printf(" %5d%5d%5d%10.0f\n", MyRank, i+1, num, vec[i]);
 }
 printf("\n");

 Count = calloc(PeTot, sizeof(int));
 CountIndex = calloc(PeTot+1, sizeof(int));
 MPI_Allgather(&num, 1, MPI_INT, Count, 1, MPI_INT, MPI_COMM_WORLD);

 MPI_Finalize();

 return 0;
}

0 件のコメント: