读取文件(ifstream)和写入文件(ofstream)-编码问题
Read from file (ifstream) and write to file (ofstream) - problems with encoding
注意:我是一个c++新手。
我有以下问题:
我读了一个文件,想用其他字符串部件替换字符串部件。简单的任务,应该很容易做。我用setmode做了一些实验,但没有成功。我也在谷歌上搜索了一下,但对我也没有帮助。
可能存在一些小的代码问题,但请关注问题。转换的测试数据如下:
int main(int argc, char** argv) {
stringstream strs;
//Choose output file
ofstream ofile;
string filename;
cout << "Ausgabepfad eingeben" << endl;
cin >> filename;
ofile.open(&filename[0]);
//Choose input file
ifstream ifile;
cout << "Quellpfad eingeben" << endl;
cin >> filename;
ifile.open(&filename[0]);
//Choose decoding - doesnt work, I know - That was for experiments
int mode = 0;
cout << "Decoding wählenn1 für _O_TEXTn2 für _O_BINARYn3 für _O_U16TEXTn4 für _O_U8TEXTn5 für _O_WTEXT" << endl;
cin >> mode;
/* switch(mode){
case 1:
_setmode (_fileno(ifstream), _O_TEXT);
break;
case 2:
_setmode (_fileno(ifstream), _O_BINARY);
break;
case 3:
_setmode (_fileno(ifstream), _O_U16TEXT);
break;
case 4:
_setmode (_fileno(ifstream), _O_U8TEXT);
break;
case 5:
_setmode (_fileno(ifstream), _O_WTEXT);
break;
default:
cerr << "ungültige Codierung gewählt"
}
*/
//Choose search string and replacement string
ifile.seekg(0); //not necessary, I know
string searchstr = "";
cout << "Suchstring eingeben" << endl;
cin >> searchstr;
string fillstr;
cout << "Ersetzungsstring eingeben" << endl;
cin >> fillstr;
cout << fillstr;
int marker = 0;
if(searchstr.length()<1){
return 0;
}
//actual program
while(!ifile.eof()){
int counter = 0;
ifile.seekg(marker);
char current = ifile.get();
if(current==searchstr[0]){ //if the first search letter matches, seet, if the others do.
marker++;
counter++;
for(int i = 1; i < searchstr.length(); i++){
ifile.seekg(marker);
if(ifile.get()==searchstr[i]){
counter++;
marker++;
}else{
marker-i;
break;
}
}
if(counter == searchstr.length()){
ofile << fillstr;
cout << endl;
}
}else{
ofile << ifile.get();
cout << ifile.get();
}
marker++;
}
ifile.close();
ofile.close();
cout << endl;
return 1;
}
以下字符串
|-
应该被取代
n
文本(示例)为:
|[[Allgemeines Deutsches Kommersbuch:1|1]]
|1
|[[Abend wird's, des Tages (Körner)]]
|[[Die Eichen (Körner)]]
|-
|[[Allgemeines Deutsches Kommersbuch:2|2]]
|2
程序运行,但不起作用。输出的是许多毫无意义的数字。
输出的是许多毫无意义的数字。
调用ifile.get()
返回类型为int_type
的值。因此CCD_ 3输出所有这些整数值。
更换
ofile << ifile.get();
使用(进行整数的格式化输出)
ofile << char( ifile.get() );
或(首选,使用未格式化的输入和输出)
ofile.put( ifile.get() );
用标准流、迭代器和算法来表达问题几乎总是一个更好的主意:
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
// lets get the logic right in terms of streams
void replace_all(std::ostream& dest, std::istream& source,
const std::string& search_for, const std::string& replace_with)
{
std::string line;
while (std::getline(source, line)) {
auto ipos = line.begin();
while (ipos != line.end())
{
ipos = std::search(ipos, line.end(), search_for.begin(),
search_for.end());
if (ipos != line.end())
{
auto start_index = std::distance(line.begin(), ipos);
line.replace(ipos, std::next(ipos, search_for.length()),
replace_with);
ipos = std::next(line.begin() + start_index + replace_with.length());
}
}
dest.write(line.data(), line.size());
dest.put('n');
}
}
// now test
int main()
{
std::string search_for = "|-";
std::string replace_with = "";
std::istringstream source_stream("|[[Allgemeines Deutsches Kommersbuch:1|1]]n"
"|1n"
"|[[Abend wird's, des Tages (Körner)]]n"
"|[[Die Eichen (Körner)]]n"
"|-n"
"|[[Allgemeines Deutsches Kommersbuch:2|2]]n"
"|2n");
std::ostringstream dest_stream;
replace_all(dest_stream, source_stream, search_for, replace_with);
std::cout << dest_stream.str();
return 0;
}
// todo: write a new main which asks for filenames, builds ifstreams and ofstreams, and calls replace_all()
预期输出:
|[[Allgemeines Deutsches Kommersbuch:2|2]]
|2
Jewels-MacBook-Pro:play richardh$ ./replace.cpp
|[[Allgemeines Deutsches Kommersbuch:1|1]]
|1
|[[Abend wird's, des Tages (Körner)]]
|[[Die Eichen (Körner)]]
|[[Allgemeines Deutsches Kommersbuch:2|2]]
|2
相关文章:
- 如何确定我已使用非编码文件到达 EOF?
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 使用文件内容作为硬编码字符串
- C++和带有国家符号的文件路径(也许用 UTF8 编码)
- 当我在 CLion 中读取数组中的 txt 文件时C++编码问题
- 从文件中读取文本时出现编码问题
- 编码大于原始文本:如何获取零和一的字符串并将它们作为实际字节写入文件
- 如何使jse文件执行编码.exe并静默添加启动?Javascript将文件添加到启动?
- 这些PGM文件是如何编码的?
- 算术编码FPAQ0(一个简单的订单-0算术文件压缩机)
- 将 JPG 编码数组从 ROS sensor_msgs/压缩图像保存到 roscpp 中的文件
- 为什么我在有关文件编码格式的QT代码中获得了混乱的代码
- BASE64图像文件用C 编码
- 从编码域中的 MPEG 文件中读取元数据
- 原始字符串文字和文件编码
- 如何在C++中将文件编码格式设置为UTF8
- 文本文件编码方案
- 什么fstream写函数写到文件(编码在post)
- 读取以tiff文件编码的标签
- 将一个文件编码为1/0二进制文件,并在c++中重建原始文件