同时读取两个不同的文件

时间:2016-01-18 04:36:05

标签: c++ file openmp


我有2个文件,我希望每个核心读取自己的文件(每个文件有5行)并显示其内容
在这段代码中我有2个核心(core0,core1),输出核心0读取core1的内容(5行)。和core1从他的内容中读了4行。

我试图让它像其他条件一样,每个文件都有自己的阅读器,但同样的问题仍然存在。我该怎么办?

    #include <vector>
#include <stdio.h>
#include <time.h>
#include <mpi.h>
#include <omp.h>
#include <fstream>
#include <iostream>
using namespace std;


void func2(int CoreID )
{

    int iFace;
    int iFaces=0;
    if (CoreID==0)
    {
        FILE* imgListFile = 0;
        char imgFilename[5012];
        char actualPath[90]="C:\\DaliaDaliaSh\\TrainingFiles\\File10img_0_C";
        strcat(actualPath , "0.txt");
        imgListFile= freopen(actualPath , "r",stdin);
        while (fgets(imgFilename, 5012, imgListFile))
        {
            ++iFaces;
            printf( "** Core = %d , Path = %s\n" , CoreID , imgFilename );

        }
        rewind(imgListFile);
    }
    else if (CoreID==1)
    {
        FILE* imgListFile2 = 0;
        char imgFilename2[5012];
        char actualPath2[90]="C:\\DaliaDaliaSh\\TrainingFiles\\File10img_0_C";
        strcat(actualPath2 , "1.txt");
        imgListFile2= freopen(actualPath2 , "r",stdin);
        while (fgets(imgFilename2, 5012, imgListFile2))
        {
            ++iFaces;
            printf( "** Core = %d , Path = %s\n" , CoreID , imgFilename2 );

        }
        rewind(imgListFile2);
    }


    //printf ("*ID = %d open actualPath= %s\n" , myId , actualPath);


    printf("core %d , iFaces= %d \n", CoreID , iFaces);
}
void main(int argc,char **argv)
{ 
    MPI::Init(argc,argv);
    int threadnum=2;
    omp_set_num_threads(threadnum);

#pragma omp parallel 
    {

        int CoreID = omp_get_thread_num();
        int x ; 

        func2(CoreID);

        cout <<"@@@@after call func inside pragma \n" ;

    }


    MPI ::Finalize();
}

1 个答案:

答案 0 :(得分:2)

您在freopen上正在stdin。因此,两个核心将使用相同的流,并且读取的文件将取决于哪个核心首先/最后打开流[这是竞争条件]。

改为定期fopen,他们不会发生冲突[正如他们现在所做的那样]