从文件中读取字符并写入另一个文件

时间:2016-09-25 18:22:40

标签: c++ arrays

我是c ++和编程的新手,所以在我的问题重复中提前抱歉。我有一个3行的文本文件:

7

00000000000000000000000 * 0000

0 0 0 R 0

我需要做的是读取第二行并将其作为char写入数组。但我不能包括第3行,因为它会进入一个完全不同的矩阵。到目前为止我的代码:

ifstream input;
input.open("input1.txt");
input >> start;
char a=0;
string line;
while (getline(input, line))
{
    a=0;
    istringstream iss(line);
    int length = line.size();
    for (int i=0; i<length; i++)
    {
        iss >> a;
        A[i] = a;
        cout << A[i] << " " << i << endl;
    }
}
input.close();

但是,使用此代码,它始终为第3行启动新数组。我究竟做错了什么?修复它的最简单方法是什么?谢谢。

-----------------------------更新----------------- ---------------------

我修改了代码,但仍然无法正常工作。我得到了这样的结果:5)-└而不是正确的结果。我目前的代码:

void Read(int &numLines, int &start, vector<char>&A, char B[][5])
{
ifstream input;
input.open("input.txt");
input >> start;
input.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
string line;
if(getline(input, line))
{
    for(char temp: line)
    {
        A.push_back(temp);
    }
}
input.close();

}

A这里是我要写第二行的矢量,char是char Start只是一个整数,我在其中存储第一行(7)

非常感谢您的建议

2 个答案:

答案 0 :(得分:0)

混合>>std::getline并非易事。例如,在input >> start;之后,行结束标记将留在流中,以防仍然需要。在你的情况下它不是,它被随后的getline调用取消,导致读取空行。

这使您对line的读取变得复杂,并迫使while循环并测试空行。

使用development environment's debugger逐步完成您的计划,您将看到我在说什么。习惯使用调试器。它可能是您遇到的最佳编程生产力工具。

解决问题的最简单方法是放置

input.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

之后

input >> start;

占用该行的末尾(以及可能在该行上的任何其他内容。这需要添加#include<limits>才能获得std::numeric_limits<std::streamsize>::max

然后你可以删除while循环并用

替换它
if (getline(input, line))

没有循环,不能从文件中消耗多行。阅读和处理第三行的逻辑可以遵循。

旁注:代替for循环,请考虑

int i = 0;
while (iss >> a)
{
    A[i] = a;
    cout << A[i] << " " << i << endl;
    i++;
}

这将在iss前进,直到它到达终点。您也可以完全抛出iss,直接从line中读取字符。

int i = 0;
for(char temp: line)
{
    A[i] = temp;
}

A如果还没有降低缓冲区溢出的可能性,那么它应该是vector

for(char temp: line)
{
    A.push_back(temp);
}

答案 1 :(得分:0)

我会选择这样的东西:

std::string start;
std::string Astring;
ifstream input;
input.open("input.txt");
input >> start;
input >> Astring;

// If you really want a char array
char * A = new char[Astring.size()];
for (unsigned int i = 0; i < Astring.size(); i++) {
    A[i] = Astring[i];
}
// Don't forget to delete after use
delete[] A;

此外,如果您稍后需要将char数组作为其他内容的输入,则可以调用Astring.c_str()而不是for循环,这将返回C样式的char数组。