//作者:Ouchz
//Gmail:ouchzsc@gmail.com
//代码功能:去掉txt文本中不合理的换行符
//其他说明:以《云图.txt》为例,先用记事本保存为unicode
//编码,保存为《云图UN.txt》,最后通过代码生成《newFile.txt》。
//txt文件在我的资源可以找到,放到工程文件夹下即可运行
//-----------------------------------------------------------------
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hFile=CreateFileW(L"云图UN.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
HANDLE hFileNew=CreateFileW(L"newFile.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,0,NULL);
if(hFile==INVALID_HANDLE_VALUE)
cout<<"打开文件失败"<<endl;
else
cout<<"打开文件成功"<<endl;
if(hFileNew==INVALID_HANDLE_VALUE)
cout<<"创建文件失败"<<endl;
else cout<<"创建文件成功"<<endl;
#define MyBufferSize 10000
bool IsEnd=false;
WCHAR ReadBuffer[MyBufferSize];
WCHAR WriteBuffer[MyBufferSize];
DWORD dwRead;
DWORD dwWrite;
int xcount=0;
while(!IsEnd)
{
memset(ReadBuffer,0xcccc,MyBufferSize*2);
memset(WriteBuffer,0xcccc,MyBufferSize*2);
ReadFile(hFile,ReadBuffer,MyBufferSize*2,&dwRead,NULL);
wchar_t *p=ReadBuffer;
if(*p==0xcccc)
break;
int writecount=0;
int i=0;
for(i=0;i<MyBufferSize;i++){
if(*p==0xcccc)
break;
WCHAR w0=*p;
WCHAR w1=*(p+1);
WCHAR w2=*(p+2);
WCHAR w3=*(p+3);
if(w0==13&&w1==10&&w2==13&&w3==10)
xcount=0;
//此处的38是由文本本身性质所定的,原文的非法回车都在每行的第38个字符之后出现。
if(xcount>38){
//到达非法换行处
if(w0==13&&w1==10&&(w2!=13||w3!=10)){
xcount=0;
p=p+2;
writecount=writecount-2;
}
}
WriteBuffer[i]=*p;
xcount++;
writecount++;
p=p+1;
}
WriteFile(hFileNew,WriteBuffer,i*2,&dwWrite,NULL);
}
return 0;
}