C++ 流误差
这是关于我提出的另一个问题,尽管这完全是它自己的问题 编译时会出现两个错误: 1> .\asst4.cpp(73):错误C2065:“输出文件”:未声明的标识符 1> .\asst4.cpp(73):错误C2228:“.close”的左侧必须具有类/结构/联合 我有点困惑,我在这里做错了什么?有什么建议或想法吗?(实际输出文件位于代码顶部附近 以下是完整的代码:C++ 流误差,c++,ofstream,C++,Ofstream,这是关于我提出的另一个问题,尽管这完全是它自己的问题 编译时会出现两个错误: 1> .\asst4.cpp(73):错误C2065:“输出文件”:未声明的标识符 1> .\asst4.cpp(73):错误C2228:“.close”的左侧必须具有类/结构/联合 我有点困惑,我在这里做错了什么?有什么建议或想法吗?(实际输出文件位于代码顶部附近 以下是完整的代码: #include<iostream> #include<fstream> //used for readin
#include<iostream>
#include<fstream> //used for reading/writing to files.
#include<string> //needed for the filename.
#include<stdio.h> //for goto statement
using namespace std;
int main()
{
string start;
char choice;
char letter;
int x;
int y;
int z;
string filename;
int garbage = rand()%('!' - '~' + 1 );
cout << "Would you like to encrypt or decrypt a file? Please type enc, dec, or stop (case sensitive): " ;
cin >> start;
while(start == "enc")
{
x = 1;
y = 1;
cout << "How many garbage characters would you like between each correct character?: " ;
cin >> z;
cout << endl << "Please insert the name of the document you wish to encrypt, make sure you enter the name, and the file type (ie: filename.txt): " ;
cin >> filename;
ifstream infile(filename.c_str());
while(!infile.eof())
{
ofstream outfile("encrypted.txt", ios::out);
infile.get(letter);
if (x == y)
{
outfile << garbage;
x++;
}
else
{
if((x - y) == z)
{
outfile << letter;
y = x;
}
else
{
outfile << garbage;
x++;
}
}
}
cout << endl << "Encryption complete...please return to directory of program, a new file named encrypted.txt will be there." << endl;
infile.close();
outfile.close();
cout << "Do you wish to try again? Please press y then enter if yes (case sensitive).";
cin >> choice;
if(choice == 'y')
{
start = "enc";
}
else
{
cout << endl << "Do you wish to decrypt a file? Please press y then enter if yes (case sensitive).";
if(choice = 'y')
{
start == "dec";
}
else
{
start == "no";
}
}
}
while(start == "dec")
{
//lets user choose whether to do another document or not.
//used to track each character in the document.
x = 1; //first counter for tracking correct letter.
y = 1; //second counter (1 is used instead of 0 for ease of reading, 1 being the "first character").
//third counter (used as a check to see if the first two counters are equal).
//allows for user to input the filename they wish to use.
cout << "Please make sure the document is in the same file as the program, thank you!" << endl << "Please input document name: " ;
cin >> filename; //getline(cin, filename);
cout << endl;
cout << "'Every nth character is good', what number is n?: ";
cin >> z; //user inputs the number at which the character is good. IE: every 5th character is good, they would input 5.
cout << endl;
z = z - 1; //by subtracting 1, you now have the number of characters you will be skipping, the one after those is the letter you want.
ifstream infile(filename.c_str()); //gets the filename provided, see below for incorrect input.
if(infile.is_open()) //checks to see if the file is opened.
{
while(!infile.eof()) //continues looping until the end of the file.
{
infile.get(letter); //gets the letters in the order that that they are in the file.
if (x == y) //checks to see if the counters match...
{
x++; //...if they do, adds 1 to the x counter.
}
else
{
if((x - y) == z) //for every nth character that is good, x - y = nth - 1.
{
cout << letter; //...if they don't, that means that character is one you want, so it prints that character.
y = x; //sets both counters equal to restart the process of counting.
}
else //only used when more than every other letter is garbage, continues adding 1 to the first
{ //counter until the first and second counters are equal.
x++;
}
}
}
cout << endl << "Decryption complete...please return to directory of program, a new file named encrypted.txt will be there." << endl;
infile.close();
cout << "Do you wish to try again? Please press y then enter if yes (case sensitive).";
cin >> choice;
if(choice == 'y')
{
start == "dec";
}
else
{
cout << endl << "Do you wish to encrypt a file? Please press y then enter if yes (case sensitive).";
if(choice == 'y')
{
start == "enc";
}
else
{
start == "no";
}
}
}
else //this prints out and program is skipped in case an incorrect file name is used.
{
cout << "Unable to open file, please make sure the filename is correct and that you typed in the extension" << endl;
cout << "IE:" << " filename.txt" << endl;
cout << "You input: " << filename << endl;
cout << "Do you wish to try again? Please press y then enter if yes (case senstive)." ;
cin >> choice;
if(choice == 'y')
{
start == "dec";
}
else
{
start == "no";
}
}
getchar(); //because I use visual C++ express.
}
}
#包括
#包含//用于读取/写入文件。
#包含文件名所需的/。
#include//for goto语句
使用名称空间std;
int main()
{
字符串开始;
字符选择;
字符字母;
int x;
int-y;
intz;
字符串文件名;
int垃圾=rand()%(“!”-“~”+1);
不能启动;
while(开始==“enc”)
{
x=1;
y=1;
cout>z;
cout文件名;
ifstream infle(filename.c_str());
而(!infle.eof())
{
流输出文件(“encrypted.txt”,ios::out);
得到(信);
如果(x==y)
{
outfile范围问题。您在while循环内声明outfile,但试图在所述while循环外访问它
将流输出文件(“encrypted.txt”,ios::out);
移动到ifstream infie(filename.c_str());
之后的一行,该行位于之前,而(!infie.eof())
您有两个选择—正如X-istence所提到的,调用outfile.close()的原因未编译,是因为对象“outfile”与outfile的声明不在同一范围内
你可以移动这条线
ofstream outfile("encrypted.txt", ios::out);
在while循环外部,使其遵守与infle相同的作用域规则,或者您可以将调用移动到outfile.close();在while循环内部,这会将其移动到outfile存在的当前作用域中
我倾向于将outfile的声明移到while循环之外,因为打开一个文件是一个非常昂贵的操作,你真的不想对你从infle读到的每封信都这样做。在这种情况下,打开它一次,关闭它一次是最好的方法。这样做了,现在我的逻辑中有一个实际的缺陷,在某个地方它被破坏了决定不打印到文件中…刚才在运行它时,当我停止它,因为它似乎已经冻结并打开了txt文件,我实际上设法让记事本崩溃,指向我!