【发布时间】:2018-11-11 05:40:25
【问题描述】:
我用 C++ 编写了一个程序,它接收一个文件和通过命令行应用到它的变形。但是,到目前为止。我的算法正在接受如下文件:
.............
.............
..XXX.....X..
..XXX.....X..
..XXX........
..XXX........
..XXXXXXX....
..XXXXXXX....
..XXXXXXX....
.............
.............
并打印出如下所示的内容:
.............
..X.X.....X..
.XXXXX...XXX.
..XXX.....X..
.XXXXX.......
..XXX.X.X....
.XXXXXXXXX...
..XXXXXXX....
.XXXXXXXXX...
..X.X.X.X....
.............
什么时候应该打印出如下所示的内容:
.............
..XXX.....X..
.XXXXX...XXX.
.XXXXX...XXX.
.XXXXX....X..
.XXXXXXXX....
.XXXXXXXXX...
.XXXXXXXXX...
.XXXXXXXXX...
..XXXXXXX....
.............
我已经让我的程序遍历每个索引并检查它是否是他们想要扩张的项目,然后查看上方、下方、左侧和右侧。将其索引的另一个副本添加到其周围的网格中。但是为什么我的程序会这样打印出来呢?
这是我目前的代码:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
//look up line by line parsing
using namespace std;
void replacee(vector<vector<char>> &vec, char oldd, char neww)
{
for (vector<char> &v : vec) // reference to innver vector
{
replace(v.begin(), v.end(), oldd, neww); // standard library algorithm
}
}
void dialationn(vector<vector<char>> &vec, char suspect, char n)
{
for (int i = 0; i < vec.size(); i ++) {
for (int j = 0; j < vec[i].size(); j++) {
if (vec[i][j] == suspect) {
if (i > 0) {
vec[i-1][j] = n;
}
if (j > 0) {
vec[i][j-1] = n;
}
if (i + 1<vec.size()) {
vec[i+1][j] = n;
}
if (j + 1<vec[i].size()) {
vec[i][j+1] = n;
}
}
}
}
replacee(vec, n, suspect);
}
void erode(vector<vector<char>> &vec, char suspect, char n)
{
for (int i = 0; i < vec.size(); i ++) {
for (int j = 0; j < vec[i].size(); j++) {
if (vec[i][j] == suspect) {
if (i > 0) {
vec[i-1][j] = n;
}
if (j > 0) {
vec[i][j-1] = n;
}
if (i + 1<vec.size()) {
vec[i+1][j] = n;
}
if (j + 1<vec[i].size()) {
vec[i][j+1] = n;
}
}
}
}
replacee(vec, n, suspect);
}
int main(int argc, char* argv[]) {
fstream fin; char ch;
string name (argv[1]); //File Name.
vector<vector<char>> data;
// 2D Vector.
vector<char> temp;
// Temporary vector to be pushed
// into vec, since its a vector of vectors.
fin.open(name.c_str(),ios::in);
// Assume name as an arbitary file.
string argument2 (argv[2]);
while(fin)
{
ch = fin.get();
if(ch!='\n') {
temp.push_back(ch);
}
else
{
data.push_back(temp);
temp.clear();
}
}
if (argument2 == "replace") {
string argument4 (argv[4]);
string argument3 (argv[3]);
replacee(data, argument3[0], argument4[0]);
for (int i = 0; i < data.size(); i ++) {
for (int j = 0; j < data[i].size(); j++) {
cout << data[i][j];
}
cout << endl;
}
}
if (argument2 == "dialate") {
string argument3 (argv[3]);
dialationn(data, argument3[0], 'i');
for (int m = 0; m < data.size(); m ++) {
for (int n = 0; n < data[m].size(); n++) {
cout << data[m][n];
}
cout << endl;
}
}
fin.close();
}
主函数将第一个参数作为文本文件名来解析它。然后,它查看第二个参数以了解用户想要做什么,然后根据参数 2,它调用适当的函数 replacee 或 dialate 来应用变形。在其中一个函数修改了包含文件的 char* 之后,它会将其打印出来。
注意:dialatee 函数将它认为适合的所有字符更改为“i”,然后调用replacee 函数将它们转换回原始输出。这样做是为了防止函数读取已修改的字符并应用无意的变形。
【问题讨论】:
-
"
while(fin)" ... Why is iostream::eof inside a loop condition considered wrong?