-1

私はこれを試しました

...
for(int i=0;i<totalDoc;i++){
        freopen(name[i],"r",stdin);
        while(cin>>s!=NULL){doc[i]=doc[i]+s+" ";}
        fclose(stdin);
        ...
}

withnameは文字「doc1.txt」、「doc2.txt」、...

しかし、このコードは「doc1.txt」しか開けません。誰か助けてくれませんか?

4

1 に答える 1

-1

C または C++ でコーディングしていますか? あなたは選ばなければなりません!

freopen(3)のドキュメントを読み、その結果を使用する必要があります。

   The freopen() function opens the file whose name is the string
   pointed to by path and associates the stream pointed to by stream
   with it.  The original stream (if it exists) is closed.

また、C++ I/O ストリーム (例std::cinおよび>>) を C ファイル (例stdinおよびfscanf...) と混在させないでください。

より多くのドキュメント (ドキュメントを読まずにヘッダー、関数、または型を使用しないでください) と本を読むために数時間を費やすことを強くお勧めします。あなたのコードは残念です。

したがって、Cでコーディングできます。

for(int i=0;i<totalDoc;i++){
   FILE*inf = freopen(name[i],"r",stdin); // wrong
   if (!inf) { perror(name[i]); exit(EXIT_FAILURE); }

しかし、それは 2 番目の反復では機能しません (stdinへの最初の呼び出しによって閉じられているためfreopen)。したがって、実際には を使用し、そのファイルから読み取る必要fopenはありません。ループ本体の最後にあることを忘れないでください。freopeninffclosefor

ところで、C++ でコーディングする場合 (C と C++ のどちらかを選択する必要があります。これらは異なる言語です)、単純にstd::ifstreamを使用します。

for(int i=0;i<totalDoc;i++){
   std::ifstream ins(name[i]);
   while (ins.good()) {
     std::string s;
     ins >> s;
     doc[i] += s + " ";
   };
}

最後に、コーディングする言語と標準 ( C++11C99とは異なります) を選択し、さらにドキュメントを読みます。また、すべての警告とデバッグ情報を有効にしてコンパイルし (たとえばg++ -std=c++11 -Wall -g、C++11 コードの場合、またはGCCgcc -std=c99 -Wall -gを使用している場合は C99 コードの場合) 、 debugger を使用します

于 2014-09-13T06:33:27.407 に答える