编写一个程序来纠正一个C ++程序,该程序在<<
和>>
中使用的运算符cin
或cout
中存在错误。该程序取代了
cin <<
修正后的版本
cin >>
和每次(不正确)的发生
cout >>
修正后的版本
cout <<
允许cin
和<<
之间以及cout
和>>
之间可能存在任意数量的空白字符(一个或多个)。替换更正版本在cin
或cout
与以下运营商之间只有一个空白。
您的程序应该将源文件名作为用户的输入。修正后的版本应输出到名称为corrected.txt
的文件中,并且还应显示在终端上。这意味着程序的输出(在获取文件名之后)应该与文件corrected.txt
的内容完全相同。您的程序应该定义一个使用输入和输出文件流作为参数调用的函数。
代码没有编译错误。但是,代码输出没有(文件存在)。编译程序后,文件中的单词也会消失。谁能给我一些建议?谢谢!
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <cctype>
#include <fstream>
#include <string>
using namespace std;
void print(ifstream& input,ofstream& output, char next)
{
input.get(next);
cout << next;
output.put(next);
while(input >> next)
{
if(next=='c')
{
output.put(next);
cout << next;
input.get(next);
if(next=='i')
{ output.put(next);
cout << next;
input.get(next);
if(next=='n')
{
output.put(next);
cout << next;
while(next==' ')
{
input.get(next);
}
output.put(' ');
if(next=='<')
{
input.get(next);
if(next == '<')
{
cout << ">>";
input.get(next);
}
else
{
output.put(next);
cout << next;
}
}
else
{
output.put(next);
cout << next;
}
}
else
{
output.put(next);
cout << next;
}
}
else if (next=='o')
{
output.put(next);
cout << next;
input.get(next);
if(next=='u')
{
output.put(next);
cout << next;
input.get(next);
if(next=='t')
{
output.put(next);
cout << next;
while(next==' ')
{
input.get(next);
}
output.put(' ');
if(next=='>')
{
input.get(next);
if(next == '>')
{
cout << "<<";
input.get(next);
}
else
{
output.put(next);
cout << next;
}
}
else
{
output.put(next);
cout << next;
}
}
else
{
output.put(next);
cout << next;
}
}
else
{
output.put(next);
cout << next;
}
input.get(next);
}
}
}
}
int main()
{
ifstream input;
ofstream output;
char next;
char filename[16];
cout << "Enter filename:" << endl;
cin >> filename;
input.open(filename);
if(input.fail()) {
cout << "Could not open the file " << endl;
exit(0);
}
output.open("original.txt");
if (output.fail()) {
cout << "Could not open the file " << filename << endl;
exit(1);
}
print(input, output, next);
input.close();
output.close();
return 0;
}
答案 0 :(得分:3)
我无法在评论中解释这一点。请不要太严厉地判断:
void print(ifstream& input,ofstream& output)
{
bool first = true;
std::string command;
while(std::getline(input, command, ';'))
{ // loop until no more input to read or input fails to be read
if (command.find("cin")!= std::string::npos)
{ // found cin somewhere in command. This is too crude to work. See below
size_t pos = command.find("<<"); // look for the first <<
while (pos != std::string::npos)
{ // keep replacing and looking until end of string
command.replace(pos, 2, ">>"); // replace with >>
pos = command.find("<<", pos); // look for another
}
}
else if (command.find("cout")!= std::string::npos)
{ // same as above, but other way around
size_t pos = command.find(">>");
while (pos != std::string::npos)
{
command.replace(pos, 2, "<<");
pos = command.find(">>", pos);
}
}
if (! first)
{
output << ';' << command; // write string to output
}
else
{
first = false;
output << command; // write string to output
}
}
}
这将捕获并正确处理大多数情况。它无法处理的是:
像
一样cout << Cincinnati; // find is just too dumb. Regex is not
^ finds a cin right here and starts reversing <<
评论
/* cout >> hah ha ha Sucker!!!; */
字符串文字
std::string fail = "cout >> Got you again!!!";
[expletive deleted]宏
#define evil cout >\
> "Gotcha!!!";
非常奇怪的事情,比如
cout << vector<vector<int>>(42)[0];
^ Muhuhahahahahaha!!!
要做到这一点,你需要一个能够检测并消除上述故障情况的非平凡状态机。