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