0

我对 c++ 相当陌生。我现在正在上一门关于结构和对象的介绍课。我们最后检查了文件,我想到了编写一个加密文本文件的程序。只是为了我自己的乐趣和知识(这不是家庭作业)。我还没有编写加密,它将是私钥,因为有人告诉我这是最简单的,这是我第一次尝试这样的事情。无论如何,我现在只是将代码编写为函数以确保它们工作,然后将它们放入类中并扩展程序。所以,现在我的代码将打开并写入一个文件。我想在加密之前查看我刚刚在cmd窗口中编写的文件,所以我知道我可以看到之前和之后。继承人的代码:

//This program will create, store and encrypt a file for sending over the inernet

#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<string>
#include<fstream>
#include"fileSelect.h"

using namespace std;

void openFile(fstream &);
void readFile(fstream &);

int main() {
    //output file stream
    fstream outputStream;
    fstream inputStream;
    string fileName, line;

    openFile(outputStream);
    readFile(inputStream);

    system("pause");
    return 0;
}
//open file Def
void openFile(fstream &fout){
    string fileName;
    char ch;
    cout<<"Enter the name of the file to open: ";
    getline(cin, fileName);
    //try to open the file for writing
    fout.open(fileName.c_str(),ios::out);
    if(fout.fail()){
        cout<<"File, "<<fileName<<" failed to open.\n";
        exit(1);
    }
    cout<<"Enter your message to encrypt. End message with '&':\n";
    cin.get(ch);
    while(ch!='.'){
        fout.put(ch);
        cin.get(ch);
    }
    fout.close();
    return;
}

void readFile(fstream &fin){
    string fileName, line;
    cout<<endl;
    cout<<"Enter the name of the file to open: ";
    getline(cin, fileName);
    //check file is good
    if(fin.fail()){
        cout<<"File "<<fileName<<" failed to open.\n";
        exit(1);
    }

    cout<<"Opening "<<"'"<<fileName<<"'" <<endl;
    //cout<<"Enter the file to open: ";
    //cin>>fileName;
    fin.open(fileName.c_str(),ios::in);
    //readFile(inputStream);
    if(fin){
        //read in data
        getline(fin,line);
        while(fin){
            cout<<line<<endl;
            getline(fin,line);
        }

        fin.close();
    }
    else{
        cout<<"Error displaying file.\n";
    }

    return ;
}

这将编译并运行。如果 openFile() 被注释掉并且 readFile() 函数被自己调用,文件将读取 openFile() 中写入的内容。它只是不会像我想要的那样一个接一个地做。这可能只是我缺少的一个简单修复,但现在它变得有点头疼。任何帮助将不胜感激。谢谢你。

4

1 回答 1

1

当您阅读要加密的消息时,您不会使用换行符。换行符保留在输入缓冲区中,将导致getline(cin, fileName);读取一个空的fileName.

您必须在阅读消息后首先跳过换行符

string tmp;
getline(cin, tmp);

然后getline()inreadFile将正常工作。

旧时

  • 你的提示说

    cout<<"Enter your message to encrypt. End message with '&':\n";
    

    但你测试.而不是&

    while(ch!='.'){
    
  • 您将 an 传递fstreamopenFileand readFile,但在这些函数中打开和关闭文件。您可以改用局部变量。

    代替

    void openFile(fstream &fout){
        ...
        fout.open(fileName.c_str(),ios::out);
    

    你写

    void openFile(){
        ...
        fstream fout;
        fout.open(fileName.c_str(),ios::out);
    

    甚至更短

    void openFile(){
        ...
        ofstream fout(fileName.c_str());
    

    此外,您必须更改openFile().

    readFilefin/ifstream适当地工作。

于 2013-04-19T07:38:43.097 回答