C语言 如何逐行读取文件,将每一行附加到向量,然后实现MPI代码

nhhxz33t  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(98)

所以我试图让一个C程序读入一个文件,这个文件是一个整数,格式是第一个值是文件的长度,下面几行是随机整数,例如:

4
2
7
8
17

3
9
23
14

我想做的是读取文件,将每一行附加到一个向量上,然后将向量拆分成相等的大小,并将它们分布到多个MPI进程中,以供后续任务使用。
我目前已经尝试过计算文件中的行数,然后通过for循环创建一个向量来存储文件中的所有元素。但是这并不奏效。我将非常感谢任何帮助。我的尝试如下:

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


int main( int argc, char *argv[]) {

     int rank, world_size;
     
     int root;
     int i;

     MPI_Init( &argc, &argv );
     MPI_Comm_rank( MPI_COMM_WORLD, &rank);

    if (rank == 0) { 
        
       char Line[100];
       char c;
       int count_lines=0;
       FILE *fp = fopen("Input_16.txt","r");
       for (c = getc(fp); c != EOF; c = getc(fp))
        if (c == '\n') // Increment count if this character is newline
           count_lines = count_lines + 1;
       
       int array[count_lines];
       for (i=0; i<count_lines; i++)
           array[i]=fgets(Line,100,fp);
           printf("Prints: %c \n",array[i]); 
           

}

    MPI_Finalize();
}
ycl3bljg

ycl3bljg1#

我对MPI一无所知,但以下是您读取文件的方式:

int read_file(const char *path, size_t *len, int **a) {
    *a = NULL;
    FILE *fp = fopen(path,"r");
    if(!fp)
        return 0;
    if(fscanf(fp, "%zu", len) != 1) {
        printf("fscanf of len failed\n");
        goto err;
    }
    if(!*len) {
        printf("len == 0\n");
        goto err;
    }
    *a = malloc(*len * sizeof **a);
    if(!*a) {
        printf("malloc failed\n");
        goto err;
    }
    for(size_t i = 0; i < *len; i++) {
        if(fscanf(fp, "%d", &(*a)[i]) != 1) {
            printf("fscanf of item %zu failed\n", i);
            goto err;
        }
    }
    fclose(fp);
    return 1;
err:
    free(*a);
    if(fp) fclose(fp);
    return 0;
}

int main( int argc, char *argv[]) {
    size_t len;
    int *a;
    if(!read_file("Input_16.txt", &len, &a)) {
        printf("file read failed\n");
        return 1;
    }

    for(size_t i = 0; i < len; i++) {
        printf("%d\n", a[i]);
    }
}

和运行示例:

2
7
8
17

相关问题