使用C ++替换文件中的字符

时间:2017-03-03 08:03:32

标签: c++ file-io

我有一个4行输入文本文件,每行固定长度为80个字符。我想用空格替换每个逗号。我编写了如下所示的代码,并在Code :: Blocks IDE中编译和运行。问题是输出文件包含一个额外的行。请帮我纠正错误。我是C ++的初学者。

inputFile

outputFile

#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;
}

5 个答案:

答案 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; });
}