我有一个4行输入文本文件,每行固定长度为80个字符。我想用空格替换每个逗号。我编写了如下所示的代码,并在Code :: Blocks IDE中编译和运行。问题是输出文件包含一个额外的行。请帮我纠正错误。我是C ++的初学者。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
ifstream in("circArc.txt", ios::in | ios::binary);
if(!in)
{
cout << "Cannot open file";
return 1;
}
ofstream out("readInt.txt", ios::out | ios::binary);
if(!out)
{
cout << "Cannot open file";
return 1;
}
string str;
char rep[80]; //replace array
while(in)
{
getline(in,str);
for(int i=0; i<80; i++)
{
if(str[i] == ',')
rep[i] = ' ';
else
rep[i] = str[i];
out.put(rep[i]);
}
out << endl;
}
in.close();
out.close();
return 0;
}
答案 0 :(得分:1)
使用
的问题while(in)
{
getline(in,str);
是你没有检查getline
是否成功。无论如何,您都在继续使用str
。
替换
while(in)
{
getline(in,str);
...
}
与
while(getline(in,str))
{
...
}
答案 1 :(得分:1)
使用C ++替换文件中字符的一种方法。
#include <iostream>
#include <fstream>
int main()
{
std::fstream fs("testFile.txt", std::fstream::in | std::fstream::out);
if (fs.is_open()) {
while (!fs.eof()) {
if (fs.get() == ',') {
fs.seekp((fs.tellp() - static_cast<std::streampos>(1)));
fs.put(' ');
fs.seekp(fs.tellp());
}
}
fs.close();
} else {
std::cout << "Faild to open" << '\n';
}
return 0;
}
答案 2 :(得分:0)
保持while()循环,但在while循环之前/之外执行一次,然后在最后一行的while循环内执行:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
ifstream in("circArc.txt", ios::in | ios::binary);
if(!in)
{
cout << "Cannot open file";
return 1;
}
ofstream out("readInt.txt", ios::out | ios::binary);
if(!out)
{
cout << "Cannot open file";
return 1;
}
string str;
char rep[80]; //replace array
getline(in,str);
while(in)
{
for(int i=0; i<80; i++)
{
if(str[i] == ',')
rep[i] = ' ';
else
rep[i] = str[i];
out.put(rep[i]);
}
out << endl;
getline(in,str);
}
in.close();
out.close();
return 0;
}
答案 3 :(得分:0)
我认为这里的问题是MATCH (user:User {user_role: 'Customer'})
WITH user
OPTIONAL MATCH (user)-[hv:HAS_VAUCHER]->(v:Vaucher {status: 2})
WITH user, count(hv) as hv
WHERE hv = 0
WITH user
CREATE (v:Vaucher {discount: 5, created_at: 1488531600, start_at: 1488531600, type: 'March', status: 2})<-[:HAS_VAUCHER]-(user)
循环中的退出条件。您可以使用:
while
答案 4 :(得分:0)
问题是std::getline
删除了行尾字符(如果存在),因此您无法(轻松)判断最终字符是否为行尾。
在我看来,您不需要了解此任务的数据格式,因此您可以一次处理一个字符:
ifstream in("circArc.txt", ios::in | ios::binary);
ofstream out("readInt.txt", ios::out | ios::binary);
for(char c; in.get(c); out.put(c))
if(c == ',')
c = ' ';
如果你真的想逐行处理,那么你需要检查读入的行是否包含行尾字符,如果输入中有一行,则只在输出中包含行尾:
ifstream in("circArc.txt", ios::in | ios::binary);
ofstream out("readInt.txt", ios::out | ios::binary);
for(std::string line, eol; std::getline(in, line); out << line << eol)
{
// only add an eol to output if there was an eol in the input
eol = in.eof() ? "":"\n";
// replace ',' with ' '
std::transform(std::begin(line), std::end(line), std::begin(line),
[](char c){ if(c == ',') return ' '; return c; });
}