您的位置:首页 > 编程语言

将源代码文件转换为文本文件的一种方法

2016-10-03 00:00 197 查看
摘要: 工作当中常常会发现,由于公司的电脑处于加密模式,想要将源代码文件拷贝一份到自己的电脑上往往需要新建一个文本文件再将源代码文件复制粘贴到这个文本文件中,否则直接拷贝的文件将会是乱码。
如果需要拷贝的文件数少,复制粘贴的方法还可以试试,一旦文件数量太多,工作量将猛增,显然我们需要一种更为高效的方法。本文在visual studio 2010采用C++写出一个自己的小程序来解决这个问题。

基本的思想是,先检查当前目录下有多少种类型的源文件,比如.cpp,.c,.cc,.java等都属于不同类型的源文件,然后采用_finddata_t结构体表征不同类型的文件,通过_findfirst和_findnext函数一一进行匹配,直到全部找到为止。

再分别打开这些文件,并打开同名的文件加上.txt后缀,将源文件读入到文本文件当中,至此完成。

main.cpp

#include "stdafx.h"
#include "FileTran.h"
#include "ListFile.h"
#include<iostream>
#include<windows.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
try{
FileTran fileTran;
ListFile listFile;
listFile.listFiles();
printf("listfile\n");
unsigned int num=listFile.getNum();
printf("num=%d\n",num);
unsigned int i=0;
while(i<num){
cout<<listFile.getFile(i)<<endl;
if(fileTran.openFile(listFile.getFile(i))){
fileTran.handleFile();
i++;
if(i==8)break;
}
}
} catch(...){
printf("something is wrong!\n");
}
std::cout<<"--------done"<<std::endl;
Sleep(2000);
return 0;
}

FileTran.cpp

#include "StdAfx.h"
#include "FileTran.h"
#include <cstdio>
#include <string>
#include<iostream>
using std::ios_base;
using std::string;
using std::getline;

FileTran::FileTran(void)
{
}

FileTran::~FileTran(void)
{
close();
}

bool FileTran::openFile(const char* filename)
{
finFile.open(filename,ios_base::in|ios_base::binary);
if(!finFile.is_open()){
printf("can not open the file,please check it out!\n");
throw "open error";
}
else{
this->filename=filename;
printf("File opened\n");
return true;
}
}

void FileTran::close()
{

}

void FileTran::handleFile()
{
string tmpname=string(filename)+string(".txt");
if(finFile.is_open()){
foutFile.open(tmpname.c_str(),ios_base::out|ios_base::binary);
if(!foutFile.is_open()){
throw "something is wrong";
}
}

string str;

while(!finFile.eof()){
std::getline(finFile,str);
foutFile<<str<<std::endl;
}
finFile.close();
foutFile.close();
}

FileTran.h

#ifndef _FILETRAN_
#define _FILETRAN_
#include<fstream>
using std::ifstream;
using std::ofstream;
class FileTran
{
public:
FileTran(void);
~FileTran(void);
public:
bool openFile(const char*);
void handleFile();
private:
void close();
private:
const char* filename;
ifstream finFile;
ofstream foutFile;
};

#endif //file tran

ListFile.cpp

#include "StdAfx.h"
#include "ListFile.h"
#include<iostream>
#include<fstream>
#include<io.h>
#include<windows.h>
#include<tchar.h>

ListFile::ListFile(void)
{
}

ListFile::~ListFile(void)
{
}

unsigned int ListFile::listFiles()
{
unsigned int cnt=0;
char buf[SIZEFILE*2];
printf("Please enter all sorts of files you wanna transfer:");
while(EOF==scanf("%d",&kindsFiles)){
printf("enter is wrong!\n");
}
printf("Please enter the regulations of files,for example: \"*.c\" means all .c files would be listed!\n");
while(EOF!=scanf("%s",regs[cnt++])){
if(cnt==kindsFiles) break;
}
cnt=0;
while(cnt!=kindsFiles){
struct _finddata_t files;
long handle=_findfirst(regs[cnt++],&files);

if(-1==handle){
printf("can not match the files!\n");
while(true);
exit(-1);
}
string tmp=string(files.name);
filesList.push_back(tmp);
while(!_findnext(handle,&files)){
tmp=string(files.name);
filesList.push_back(tmp);
}
}
nums=filesList.size();
return nums;
}

void ListFile::disFiles()
{
list<string>::iterator listPtr=filesList.begin();
for(int i=0;i<nums;i++,listPtr++){
strcpy(allFiles[i],listPtr->c_str());
}
}

char* ListFile::getFile(unsigned int n)
{
disFiles();
return allFiles
;
}

unsigned int ListFile::getNum()
{
return nums;
}

ListFile.h

#ifndef _LISTFILE_
#define _LISTFILE_
#include<cstdio>
#include<string>
#include<list>
#define SIZEFILE 80
#define NUMFILE  80
using std::string;
using std::list;

class ListFile
{
public:
ListFile(void);
~ListFile(void);
private:
unsigned int kindsFiles;
char regs[NUMFILE][SIZEFILE];
list<string> filesList;
char allFiles[NUMFILE][SIZEFILE];
unsigned int nums;
public:
unsigned int listFiles();
void disFiles();
char* getFile(unsigned int);
unsigned int getNum();
};

#endif //list file

stdafx.cpp

#include "stdafx.h"

stdafx.h

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>

targetver.h

#pragma once

// 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。

// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将
// WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。

#include <SDKDDKVer.h>


在visual studio 2010版及以上版本上编译,可生成.exe文件,将这个.exe文件和需要转换的源代码文件放到同一个目录中,打开.exe文件按照提示进行操作即可!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ visual studio