尝试在C ++中将文本文件拆分为多个文本文件

时间:2012-11-22 22:30:28

标签: c++

我正在尝试使用此代码将输入文件拆分为两个文件。我想要拆分代码,以便一个新文件包含所有奇数字符,另一个文件包含所有偶数字符。我的代码没有给我任何错误,它产生了两个新文件,但是这两个新文件中没有任何内容。我想知道我的代码有什么问题(我确信它有很多错误)。我对编程还很陌生。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void split(char sourceFile[], char destFile1[], char destFile2[]) {
    int chars = 0;
    ifstream sFile;
    sFile.open(sourceFile);
    ofstream file1;
    file1.open(destFile1);
    ofstream file2;
    file2.open(destFile2);

    while (!sFile.eof()) {
        sFile.read(sourceFile + chars, 1);

        cout << sourceFile[chars];
        if (chars % 2 == 0) {
            file1 << sourceFile[chars];
        } else {
            file2 << sourceFile[chars];
        }
        chars++;


    }
}

int main() {
    split("text.txt", "one.txt", "two.txt");
    return 0;
}

5 个答案:

答案 0 :(得分:1)

它有很多错误(如你所说)

1)您的所有文件都是ifstream,如果您想使用ofstream输出到文件。

2)您不应该尝试将文件名用作代码的变量。只需声明一个新的char变量。

3)使用get not read来读取单个字符。

4)正确测试文件结尾。

5)不要关闭循环内的文件,实际上不要关闭文件,退出函数时会自动关闭。

6)chars%2 == 5到底是什么意思?它永远不会成真。

把它们放在一起

char ch;
while (sFile.get(ch))
{
    if (chars % 2 == 0)
        file1 << ch;
    else
        file2 << ch;
    chars++;
}

答案 1 :(得分:1)

一些非常严重的问题:

  • 你的循环控制毫无意义。它没有明确定义 当'istream :: eof()'变为true时,但是当读取字节时 字节,正如你所做的那样,它可能会让你进入 循环多一次你想要的时间。

  • 相关问题是您验证读取 成功了。读取的成功应该是你的循环控制。

  • 您正在阅读未定义的字符文字 行为(并将在很多系统上崩溃);够了 读,你正在阅读超出文字的结尾,进入 未定义的记忆。你真的应该使用本地缓冲区 读取。

  • 您不进行任何错误检查。至少,你 应验证您是否已成功打开文件,并且您 应关闭输出文件,并检查其状态后 关闭,以确保写入有效。

我可能会使用类似的东西:

void
split( std::string const& source, 
       std::string const& dest1,
       std::string const& dest2 )
{
    std::istream in( source.c_str() );
    if ( ! in.is_open() ) {
        //  Cannot open source...
    }
    std::ostream out1( source.c_str() );
    if ( ! out1.is_open() ) {
        //  Cannot create dest1
    }
    std::ostream out2( source.c_str() );
    if ( ! out2.is_open() ) {
        //  Cannot create dest2
    }
    std::ostream* currentOut = &out1;
    std::ostream* otherOut = &out2;
    char ch;
    while ( in.get( ch ) ) {
        currentOut->put( ch );
        std::swap( currentOut, otherOut );
    }
    out1.close();
    if ( !out1 ) {
        //  Write error on dest1...
    }
    out2.close();
    if ( !out2 ) {
        //  Write error on dest2...
    }
}

(如您所见,执行复制的实际循环是 非常简单。大多数代码都涉及错误 处理。)

答案 2 :(得分:0)

你的缩进是误导!文件close()调用 in 循环。

并且:i % 2 == 5永远不会是真的。 if (i % 2 == 0) { ... } else { ... }怎么样?

答案 3 :(得分:0)

你忘记了';'拼错'sourcFile'

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void split(char sourceFile[], char destFile1[], char destFile2[])
{
int chars = 0;

ifstream sFile;
sFile.open (sourceFile);

ofstream file1;
file1.open (destFile1);

ofstream file2;
file2.open (destFile2);

while (!sFile.eof())
{
    sFile.read(sourceFile+chars,1); // forgot ';'

    cout << sourceFile[chars];
    if (chars % 2 == 0)
    {
        file1<< sourceFile[chars];
    }
    else if(chars % 2 == 5)
    {
        file2 << sourceFile[chars]; // misspelled 'sourcFile'
    }
    chars++;

sFile.close();
file1.close();
file2.close();
}

}

int main()
{
split("text.txt", "one.txt", "two.txt");
return 0;
}

虽然没有测试过输出。如果它不起作用,你能给我们输入文件来试试吗?

答案 4 :(得分:0)

不是问题的答案,而是实现预期目标的程序的某种紧凑版本:

#include <algorithm>
#include <iterator>
#include <fstream>
#include <functional>

int main()
{
    typedef std::ostreambuf_iterator<char> oit;
    unsigned int chars(0);
    std::for_each(std::istreambuf_iterator<char>(
                      std::ifstream("text.txt") >> std::noskipws),
                  std::istreambuf_iterator<char>(),
                  std::bind([=](oit _1, oit _2, char c) mutable {
                          *(chars++ % 2? _1: _2)++ = c; },
                      oit(std::ofstream("one.txt") << std::dec),
                      oit(std::ofstream("two.txt") << std::dec),
                      std::placeholders::_1));
}