編寫文件操作的頭文件
/**************************************************************************
Copyright(C) :2014-08-5 toto
Filename :file.h
Author :塗作權
Version :V1.1
Date :2014-08-05
Description :文件操作的頭文件
Others :參考了原來的多線程操作和單線程操作當當網數據
FunctionList :
History:修改歷史記錄列表,每條修改記錄應該包括修改日期
1.Date:
Author:
Modification:
**************************************************************************/
/*將安全檢查警報設置為失效,必須放在第一行*/
#pragma warning(disable:4996)
#ifndef _FILE_H_
#define _FILE_H_
#include
#include
#include
#include
#include
/*************************************************************
Function :getFileRow
Description :獲得文件的中記錄的行數
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
path :表示的是文件的路徑
Output :輸出的信息為空
Return :返回文件中的行數
Others :其它說明
*************************************************************/
extern int getFileRow(const char *path);
/*************************************************************
Function :main_view
Description :查看菜單信息
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
Output :輸出的信息為空
Return :返回值為void
Others :其它說明
*************************************************************/
extern void main_view();
/*************************************************************
Function :getFileSize
Description :獲得文件的大小(字節數)
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
path :表示的文件路徑
Output :輸出的信息為空
Return :文件的字節大小
Others :其它說明
*************************************************************/
extern int getFileSize(const char *path);
/*************************************************************
Function :loadFile
Description :加載文件
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
path :表示的是文件路徑
rowSize :表示的是文件中信息由多少行
Output :輸出的信息為空
Return :返回值為int,如果加載成功返回1,如果加載失敗返回0
Others :其它說明
*************************************************************/
extern int loadFile(const char *fPath, const int rowSize);
/*************************************************************
Function :findStringByKeyword
Description :通過關鍵字的方式進行查找
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
keyword :通過關鍵字查找信息
rowSize :表示的是文件中信息由多少行
Output :輸出的信息為空
Return :如果查找失敗返回0,查找成功返回1
Others :其它說明
*************************************************************/
extern int findStringByKeyword(const char *keyword, const int rowSize);
/*************************************************************
Function :freeMemory
Description :釋放內存空間
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
pp :存儲文件信息的二重指針
rowSize :表示的行大小
Output :輸出的信息為空
Return :返回值為void
Others :其它說明
*************************************************************/
extern void freeMemory(char **pp, const int rowSize);
/*************************************************************
Function :writeStr2File
Description :將字符串拼接的方式寫入文件
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
pFilePath :要寫入的文件路徑
pStr :要寫入的字符串
mode :表示寫入的模式,0:表示直接追擊 1:表示換行追加
Output :輸出的信息為空
Return :如果寫入成功返回1,如果寫入失敗返回0
Others :其它說明
*************************************************************/
extern int writeStr2File(const char *pFilePath, const char *pStr, int mode);
/*************************************************************
Function :copy()
Description :將一個文件拷貝到另外一個文件
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
pDestFile :要寫入的文件
pOriginalFile :原始文件
mode :表示寫入的模式,0:表示直接追擊 1:表示換行追加
Output :輸出的信息為空
Return :如果寫入成功返回1,如果寫入失敗返回0
Others :其它說明
*************************************************************/
extern int copy(const char *pDestFile, const char *pOriginalFile);
/*************************************************************
Function :encryptFileByChar()
Description :將文件按照ch進行加密,並將文件輸出到指定文件中
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
pDestFile :要寫入的文件
pOriginalFile :原始文件
ch :用於加密的字符
Output :輸出的信息為空
Return :如果寫入成功返回1,如果寫入失敗返回0
Others :其它說明
*************************************************************/
extern int encryptFileByChar(const char *pDestFile,
const char *pOriginalFile, const char ch);
/*************************************************************
Function :deCodeFileByChar()
Description :通過ch進行解密文件,並將文件輸出到指定的文件中
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
pDestFile :要寫入的文件
pOriginalFile :原始文件
ch :用於解密的字符
Output :輸出的信息為空
Return :如果寫入成功返回1,如果寫入失敗返回0
Others :其它說明
*************************************************************/
extern int deCodeFileByChar(const char *pDestFile,
const char *pOriginalFile, const char ch);
/*************************************************************
Function :stringEncrypt()
Description :將字符串變成字符串加密後的字符串
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
pwdStr :將字符串變成加密後的字符串
str :要加密的字符串
Output :輸出的信息為空
Return :返回加密後的字符串地址
Others :其它說明
*************************************************************/
extern char * str2EncryptString(char *pwdStr, char *str);
/*************************************************************
Function :str2DecodedString()
Description :將字符串變成解密之後的文件
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
pwdStr :將字符串變成加密後的字符串
str :要解密的字符串
Output :輸出的信息為空
Return :返回解密後的字符串地址
Others :其它說明
*************************************************************/
extern char * str2DecodedString(char *pwdStr, char *str);
/*************************************************************
Function :encryptAndDecodeFileByString()
Description :通過字符串str來加解密文件
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
pDestFile :要寫入的文件
pOriginalFile :原始文件
pwdString :用於加解密的字符
Output :輸出的信息為空
Return :如果寫入成功返回1,如果寫入失敗返回0
Others :其它說明
*************************************************************/
extern int encryptAndDecodeFileByString(const char *pDestFile,
const char *pOriginalFile, const char* pwdString);
#endif
2.文件操作的實現函數
#define _CRT_SECURE_NO_WARNINGS
#include "file.h"
char **pp = NULL; //存儲指針數組的地址
int flag = 0;
/*************************************************************
Function :getFileRow
Description :獲得文件的中記錄的行數
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
path :表示的是文件的路徑
Output :輸出的信息為空
Return :返回文件中的行數
Others :其它說明
*************************************************************/
int getFileRow(const char *path)
{
FILE *pf;
pf = fopen(path, "r");
if (pf == NULL)
{
//代表獲取失敗
fclose(pf);
return -1;
}
else
{
int i = 0;
//是否到文件末尾,如果到了返回1,沒有到的時候返回0
while (!feof(pf))
{
char str[275];
//讀取一行
fgetc(str, 275, pf);
i++;
}
fclose(pf);
return i;
}
}
/*************************************************************
Function :main_view
Description :查看菜單信息
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
Output :輸出的信息為空
Return :返回值為void
Others :其它說明
*************************************************************/
void main_view()
{
system("cls");
printf("\n******************當當用戶信息查詢系統*******************\n");
printf("\t1.載入數據至內存(-l)\n");
printf("\t2.查找字符串(-s)\n");
printf("\t3.釋放內存(-f)\n");
printf("\n*************************0.退出**************************\n");
}
/*************************************************************
Function :getFileSize
Description :獲得文件的大小(字節數)
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
path :表示的文件路徑
Output :輸出的信息為空
Return :文件的字節大小
Others :其它說明
*************************************************************/
int getFileSize(const char *path)
{
//定義一個文件指針
FILE *pf = NULL;
pf = fopen(path, "r");
if (pf == NULL)
{
//代表獲取文件失敗
fclose(pf);
return -1;
}
else
{
//fseek():Moves thefile pointer to a specified location.
fseek(pf, 0, SEEK_END);
//ftell( FILE*stream ):文件開頭到當前位置有多少個字節
int num = ftell(pf);
//關閉文件
fclose(pf);
return num;
}
}
/*************************************************************
Function :loadFile
Description :加載文件
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
path :表示的是文件路徑
rowSize :表示的是文件中信息由多少行
Output :輸出的信息為空
Return :返回值為int,如果加載成功返回1,如果加載失敗返回0
Others :其它說明
*************************************************************/
int loadFile(const char *fPath, const int rowSize)
{
printf("加載文件後,請稍後....");
FILE *pf;
pp = (char **)malloc(sizeof(char *)* rowSize);
pf = fopen(fPath, "r");
if (pf == NULL)
{
printf("對不起,加載文件失敗!");
fclose(pf);
return 0;
}
else
{
int i;
for (i = 0; i < rowSize;i++)
{
//讀取字符串的緩沖區
char str[275] = { 0 };
//*fgets(char*string,int n,FILE *stream);
//從文件中逐行讀取字符串
fgets(str,sizeof(str) ,pf);
//獲取要分配的字符串長度,最後加一是因為'\0'
int strlength = strlen(str) + 1;
//分配內存
char *px = (char *)malloc(sizeof(char) * strlength);
//拷貝字符串
strcpy(px, str);
//設定最後一個字符串'\0'
px[strlength - 1] = '\0';
//存儲字符串的首地址到指針數組
pp[i] = px;
}
}
return 1;
}
/*************************************************************
Function :findStringByKeyword
Description :通過關鍵字的方式進行查找
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
keyword :通過關鍵字查找信息
rowSize :表示的是文件中信息由多少行
Output :輸出的信息為空
Return :如果查找失敗返回0,查找成功返回1
Others :其它說明
*************************************************************/
int findStringByKeyword(const char *keyword, const int rowSize)
{
if (pp == NULL)
{
printf("對不起,您還沒有加載文件,請您先加載文件\n");
return 0;
}
else
{
int i;
for (i = 0; i < rowSize;i++)
{
//遍歷所有的指針數組的地址,字符串查找
char *pTemp = strstr(pp[i],keyword);
if (pTemp != NULL)
{
printf("\n%s",pp[i]);
}
}
}
return 1;
}
/*************************************************************
Function :freeMemory
Description :釋放內存空間
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
pp :存儲文件信息的二重指針
rowSize :表示的行大小
Output :輸出的信息為空
Return :返回值為void
Others :其它說明
*************************************************************/
void freeMemory(char **pp, const int rowSize)
{
int i;
for (i = 0; i < rowSize;i++)
{
free(pp[i]);
}
free(pp);
flag = 0;
}
/*************************************************************
Function :writeStr2File
Description :將字符串拼接的方式寫入文件
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
pFilePath :要寫入的文件路徑
pStr :要寫入的字符串
mode :表示寫入的模式,0:表示直接追擊 1:表示換行追加
Output :輸出的信息為空
Return :如果寫入成功返回1,如果寫入失敗返回0
Others :其它說明
*************************************************************/
int writeStr2File(const char *pFilePath, const char *pStr, int mode)
{
FILE *pf;
//a+表示以追加的方式寫文件,如果
pf = fopen(pFilePath, "a+");
if (pf == NULL)
{
//表示文件打開失敗
fclose(pf);
return 0;
}
else
{
if (mode)
{
fputs(pStr, pf);
//通過加入'\r'的方式換行,如果隔行輸出使用'\r\n'
fprintf(pf, "\r");
}
else
{
fprintf(pf, pStr);
}
fclose(pf);
}
//寫入成功返回1
return 1;
}
/*************************************************************
Function :copy()
Description :將一個文件拷貝到另外一個文件
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
pDestFile :要寫入的文件
pOriginalFile :原始文件
mode :表示寫入的模式,0:表示直接追擊 1:表示換行追加
Output :輸出的信息為空
Return :如果寫入成功返回1,如果寫入失敗返回0
Others :其它說明
*************************************************************/
int copy(const char *pDestFile, const char *pOriginalFile)
{
FILE *pfr, *pfw;
//以代開二進制文件的方式打開
pfr = fopen(pOriginalFile, "r");
//要寫入的文件
pfw = fopen(pDestFile, "w");
if (pfr == NULL || pfw == NULL)
{
fclose(pfr);
fclose(pfw);
return 0;
}
else
{
int length = getFileSize(pOriginalFile);
//分配內存,讀取文件
char *p = (char *)malloc(length * sizeof(char));
//讀取文件到內存
fread(p,sizeof(char),length,pfr);
//寫入文件
fwrite(p,sizeof(char),length,pfw);
//關閉文件
fclose(pfr);
fclose(pfw);
}
return 1;
}
/*************************************************************
Function :encryptFileByChar()
Description :將文件按照ch進行加密,並將文件輸出到指定文件中
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
pDestFile :要寫入的文件
pOriginalFile :原始文件
ch :用於加密的字符
Output :輸出的信息為空
Return :如果寫入成功返回1,如果寫入失敗返回0
Others :其它說明
*************************************************************/
int encryptFileByChar(const char *pDestFile,
const char *pOriginalFile, const char ch)
{
FILE *pfr, *pfw;
//以讀的方式寫入文件
pfr = fopen(pOriginalFile, "r");
//以寫的方式寫入文件中
pfw = fopen(pDestFile, "w");
if (pfr == NULL || pfw == NULL)
{
//表示加載失敗
fclose(pfr);
fclose(pfw);
return 0;
}
else
{
//讀取原始文件中的大小(通過這種方式獲得字節數大小)
int length = getFileSize(pOriginalFile);
//分配內存,讀取文件
char *p = (char *)malloc(sizeof(char) * length);
//讀取文件到內存中
fread(p,sizeof(char),length,pfr);
int i;
for (i = 0; i < length;i++)
{
//加密方法是,於指定字符串進行異或操作
p[i] ^= ch;
}
//寫入文件
fwrite(p,sizeof(char),length,pfw);
fclose(pfr);
fclose(pfw);
}
return 1;
}
/*************************************************************
Function :deCodeFileByChar()
Description :通過ch進行解密文件,並將文件輸出到指定的文件中
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
pDestFile :要寫入的文件
pOriginalFile :原始文件
ch :用於解密的字符
Output :輸出的信息為空
Return :如果寫入成功返回1,如果寫入失敗返回0
Others :其它說明
*************************************************************/
int deCodeFileByChar(const char *pDestFile,
const char *pOriginalFile, const char ch)
{
FILE *pfr, *pfw;
pfr = fopen(pOriginalFile, "r");
pfw = fopen(pDestFile,"w");
if (pfr == NULL || pfw == NULL)
{
fclose(pfr);
fclose(pfw);
//如果是成功,則
return 0;
}
else
{
//讀取原始文件的大小
int length = getFileSize(pOriginalFile);
//分配內存,讀取文件
char *p = (char *) malloc(sizeof(char) * length);
//讀取文件到內存中
fread(p, sizeof(char), length, pfr);
int i;
for (i = 0; i < length; i++)
{
//解密方法是,於指定字符串進行異或操作
p[i] ^= ch;
}
fwrite(p, sizeof(char), length, pfw);
//關閉文件
fclose(pfr);
fclose(pfw);
}
return 1;
}
/*************************************************************
Function :stringEncrypt()
Description :將字符串變成字符串加密後的字符串
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
pwdStr :將字符串變成加密後的字符串
str :要加密的字符串
Output :輸出的信息為空
Return :返回加密後的字符串地址
Others :其它說明
*************************************************************/
char * str2EncryptString(char *pwdStr, char *str)
{
//獲取加密長度
int pwdStrLength = strlen(pwdStr);
//獲取字符串的長度
int strLength = strlen(str);
if (strLength % pwdStrLength)
{
int times = strLength / pwdStrLength;
int i, j;
//循環次數
for (i = 0; i < times; i++)
{
for (j = 0; j < pwdStrLength;j++)
{
str[pwdStrLength * i + j] ^= pwdStr[j];
}
}
}
else
{
//獲取循環次數
int times = strLength / pwdStrLength;
int i, j;
for (i = 0; i < times;i++)
{
//循環密碼
for (j = 0; j < pwdStrLength;j++)
{
str[pwdStrLength * i + j] ^= pwdStr[j];
}
}
//剩下的長度
int lastLength = strLength % pwdStrLength;
for (i = 0; i < lastLength;i++)
{
str[pwdStrLength * (strLength / pwdStrLength) + i] ^= pwdStr[i];
}
}
return str;
}
/*************************************************************
Function :str2DecodedString()
Description :將字符串變成解密之後的文件
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
pwdStr :將字符串變成加密後的字符串
str :要解密的字符串
Output :輸出的信息為空
Return :返回解密後的字符串地址
Others :其它說明
*************************************************************/
char * str2DecodedString(char *pwdStr, char *str)
{
//獲取加密長度
int pwdStrLength = strlen(pwdStr);
//獲取字符串的長度
int strLength = strlen(str);
if (strLength % pwdStrLength)
{
int times = strLength / pwdStrLength;
int i, j;
//循環次數
for (i = 0; i < times; i++)
{
for (j = 0; j < pwdStrLength; j++)
{
str[pwdStrLength * i + j] ^= pwdStr[j];
}
}
}
else
{
//獲取循環次數
int times = strLength / pwdStrLength;
int i, j;
for (i = 0; i < times; i++)
{
//循環密碼
for (j = 0; j < pwdStrLength; j++)
{
str[pwdStrLength * i + j] ^= pwdStr[j];
}
}
//剩下的長度
int lastLength = strLength % pwdStrLength;
for (i = 0; i < lastLength; i++)
{
str[pwdStrLength * (strLength / pwdStrLength) + i] ^= pwdStr[i];
}
}
return str;
}
/*************************************************************
Function :encryptAndDecodeFileByString()
Description :通過字符串str來加解密文件
Calls :被本函數調用的函數清單
CalledBy :調用本函數的函數清單
TableAccessed :被訪問的表(此項僅對於牽扯到數據庫操作的程序)
TableUpdated :被修改的表(此項對於牽扯到數據庫操作的程序)
pDestFile :要寫入的文件
pOriginalFile :原始文件
pwdString :用於加解密的字符
Output :輸出的信息為空
Return :如果寫入成功返回1,如果寫入失敗返回0
Others :其它說明
*************************************************************/
int encryptAndDecodeFileByString(const char *pDestFile,
const char *pOriginalFile, const char* pwdString)
{
FILE *pfr, *pfw;
//讀取
pfr = fopen(pOriginalFile, "r");
//寫入
pfw = fopen(pDestFile, "w");
if (pfr == NULL || pfw == NULL)
{
fclose(pfw);
fclose(pfr);
return 0;
}
else
{
int length = getFileSize(pOriginalFile);
char *newstr = (char*)malloc(sizeof(char) * (length + 1));
int i;
for (i = 0; i < length;i++)
{
//獲取一個字符
char ch = fgetc(pfr);
//不斷存入字符
newstr[i] = ch;
}
//字符串處理為'\0'
newstr[length] = '\0';
//加密字符串
str2EncryptString(pwdString,newstr);
for (i = 0; i < length;i++)
{
//挨個寫入字符
fputc(newstr[i], pfw);
}
}
fclose(pfr);
//關閉文件
fclose(pfw);
return -1;
}