2009-07-26 10 views
1

プログラムの外で作成したファイルから読み込もうとしていますが、問題があります。このプログラムでは、ユーザーがファイルを作成します。次に、プログラムの外部で作成された2つの.txtファイルから単語を読み取り、作成したファイルに単語を書き込みます。外部から作成されたファイルからデータを読み取る

#include "std_lib_facilities.h" 

int main() 
{ 
    string word; 

    cout << "Create file.\n"; 
    char name[20]; 
    cin >> name; 
    ofstream ost(name, ios::out); 

    cout << "Open first file.\n"; 
    char filename[20]; 
    cin >> filename;  
    ifstream ist(filename); 
    while(ist >> word) ost << word << " "; 
    ist.close(); 

    cout << "Open second file.\n"; 
    cin >> filename; 
    ifstream isttwo(filename); 
    while(isttwo >> word) ost << word << " "; 
    isttwo.close(); 

    ost.close(); 

    keep_window_open(); 
} 

ただし、作成したファイルをメモ帳で開くと、空白になります。これは、読み込まれているファイルが別々に作成されたため、文字列を読み込むことができないためですか?私は本当にわからない。どんな助けもありがとうございます。

+1

ループがまったく実行されていることを確認しましたか?何らかの理由でistとisttwoのオープンが失敗したため、単に空白になる可能性があります。 – Sean

+0

ええ、それは問題です。私はtxtファイルからの単語が単語に読み込まれているとは思わない。私は単語を読み込む方法を知る必要があります。私がそれをテストしたとき、私はwhileループの中にcout << wordを追加しましたが、何も出てこなかった。 – trikker

+0

私はこのコードを試したところ、完全に機能しました。入力ファイルが正しいディレクトリにあると確信していますか? (出力ファイルが作成されたディレクトリと同じディレクトリにあるはずです) – Sean

答えて

1

コードは正しいです。最初のファイルの名前を書き留めて、2番目のファイルの拡張子を書き込むようにしてください。たとえば :

first.txt 
second.txt 
+0

ファイル形式を組み込むと正しく動作しました。 – trikker

0

潜在的な問題は、getlineの代わりにcinを使用することです。

は、この入力を想像:

Open second file. 
>>file one.txt 

CINはあなたがスペースを打つ一度読んで停止しますので、これは明らかに、必要なファイルを開くことができません。

ost.open(name); 

私もしばらくループで>>オペレータのあなたの暗黙の使用を好きではない:

は、明示的に、名前を開いてみてください。これを試してください:

while (!ist.eof()) 
{ 
    getline(ist, word); 
    ost << word; 
} 
+0

これは実際の演習用コードであり、エラー処理を実装する意図はありません。 – trikker

+0

cinオブジェクトは空白で厄介なこともするので、問題ではないと思ってもgetlineを使いたいかもしれません。 – jkeys

+0

あなたが本当に私の質問に答えることができればそれは素晴らしいでしょう。さもなければあなたの答えは単なる運動のために不要なコードの最適化です。 – trikker

0

ファイル名[20]文字列を終了させないでください。 filename [20] = {0}のように。標準入力からそれを得る前に。次に、コンソールにファイル名を印刷して、ファイル名がOKかどうかを確認してください。

+0

いいえ、char *は、配列の最後のバイトに書き込もうとしない限り、常にnullで終了します。 – jkeys

0

Trikker、

コード些細な変更でコンパイルされ、実際にそれが動作けれども、私は、あなたが持っているのと同じ問題に出くわしました。ここで私と何が起こったのですか?プログラムをどのように実行しているかと関係があります。 exeファイルは../ProjectDir/Debugディレクトリに保存されます。 2つの入力ファイルをDebugディレクトリに保存する場合は、IDEからではなくコマンドプロンプトからプログラムを実行する必要があります(Visual Studio 2008を前提としています)。ただし、IDEから実行する場合は、2つの入力ファイルを../ProjectDir/ProjectDirに保存します。私がやったことはすべて私と一緒に大丈夫だった。

このディレクトリのことについては、プログラムが実行されているディレクトリをIDEから印刷しました。プロンプトがDebugディレクトリからexeを実行していることを示していますが、作業ディレクトリは実際はProjectDir/ProjectDirでした。

とにかく、次のコードをショットしてお知らせください。

//#も、おそらくそれがすべてで何かを読んでいた場合はプリントアウトしようとしたときに、何かを取得していない理由を説明する「std_lib_facilities.h」を

#include <fstream> 
#include <iostream> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
    system("cd"); 
    //string word; 
    char word[80]; 
    cout << "Create file.\n"; 
    char name[20]; 
    cin >> name; 
    ofstream ost(name, ios::out); 

    cout << "Open first file.\n"; 
    char filename[20]; 
    cin >> filename;  
    ifstream ist(filename); 
    while(ist >> word) ost << word << " "; 
    ist.close(); 

    cout << "Open second file.\n"; 
    cin >> filename; 
    cout << filename; 
    ifstream isttwo(filename); 
    while(isttwo >> word) ost << word << " "; 
    isttwo.close(); 

    ost.close(); 

    //keep_window_open(); 
} 

このディレクトリの問題があります。おそらく、入力ファイルの作成が成功したかどうかを確認したはずです。これを行うには、ちょうど追加して...あなたは絶対パスを使用している場合はどうなりますか

ifstream ist(filename) 
0

if (ist.fail()){ 
    cout << "file open failed\n"; 
} 

?例えばWindowsではc:\file.txtなどと試してください。

関連する問題