1

最初の行を読み取って実行した後、プログラムが終了するため、ループに間違いがあります。

if (infile.is_open())
{
    cout << "Input filename: ";
    cin>>filename;
    infile.open(filename.c_str());

    cout<< "Output filename: ";
    cin>>filename;
    outfile.open(filename.c_str());


    while(getline(infile,input))
    {
        string output = "";
        for(int x = 0; x < input.length(); x++)
            output += cipher(input[x]);

        cout<<output<<endl;
        outfile<<output;
    }
}

これを機能させる方法について何か提案はありますか?

編集

提案に従って、これを得ました:

if (infile.is_open()) {

        cout << "Input filename: ";
        cin>>filename;
        infile.open(filename.c_str());
        if (!infile.is_open())
        {
        std::cout << "Failed to open the input file." << std::endl;
        return -1;
        }


        cout<< "Output filename: ";
        cin>>filename;
        outfile.open(ofilename.c_str());
        if (!outfile.is_open())
        {
        std::cout << "Failed to open the output file." << std::endl;
        return -1;
        }


        while(getline(infile,line)){

        string output = "";
        for(int x = 0; x < input.length(); x++) {

        output += cipher(input[x]);


        }

        }

しかし、それでも最初の行しか読み取れません...他のすべては完全に正常に機能しています....最初の行を超えて何も読み取れません..

4

2 に答える 2

1

fstream次のコードから、のis_open()メソッドのポイントを誤解しているようです。

if (infile.is_open())
{
    cout << "Input filename: ";
    cin>>filename;
    infile.open(filename.c_str());
    ...
}

infileが正常に開かれたかどうか (つまり、メンバーへの以前の呼び出しがopen成功したか、パラメーター化されたコンストラクターを使用してオブジェクトが正常に構築
され、それ以降 close が呼び出されていない
か) をチェックし、開いている場合は入力の名前を取得しますからファイルcinを開き、ファイルを開きます。

入力ファイルから行ごとに読み取り、これらの行を処理せずに出力ファイルに書き込むプログラムから始めるとよいでしょう。

// retrieve the name of the input file and open it:
cout << "Input filename: ";
cin>>filename;
infile.open(filename.c_str());
if (!infile.is_open())
{
    std::cout << "Failed to open the input file." << std::endl;
    return -1;
}

// retrieve the name of the output file and open it:
cout << "Output filename: ";
cin >> filename;
outfile.open(filename.c_str());
if (!outfile.is_open())
{
    std::cout << "Failed to open the output file." << std::endl;
    return -1;
}

std::string line;
while(getline(infile,line))
{
    std::cout << line << std::endl;
    outfile << line;
}
于 2013-03-20T02:05:15.793 に答える
0

だから私はこれを提案します。

  1. char cipher(char ch)any の暗号化された入力を返すように書き込みます。空白を暗号化したくない場合は、暗号化しないでください。ただし、常に暗号化された文字または変更されていない文字を返します。

  2. std::transformstd::istream_iterator、およびを使用std::ostream_iteratorして、入力ファイルと出力ファイルを変換します。

  3. 正しいタイミングでファイルの状態を確認してください。

以下に例を示します。

#include <iostream>
#include <fstream>
#include <iteraor>
#include <string>
using namespace std;

char cipher(char ch)
{
    if (std::isalpha(ch))
    {
        // TODO: change ch to whatever you want here.
    }

    // but always return it, whether you changed it or not.
    return ch;
}

int main()
{
    int res = EXIT_SUCCESS;

    string in_filename, out_filename;
    cout << "Input filename: ";
    cin >> in_filename;
    cout << "Output filename: ";
    cin >> out_filename;

    // don't skip whitespace
    ifstream infile(in_filename);
    ofstream outfile(out_filename);
    if ((infile >> noskipws) && outfile)
    {
        std::transform(istream_iterator<char>(infile),
                       istream_iterator<char>(),
                       ostream_iterator<char>(outfile),
                       cipher);
    }
    else
    {
        perror("Failed to open files.");
        res = EXIT_FAILURE;
    }
    return res;
}
于 2013-03-20T02:28:09.943 に答える