fstream
#include <cstring>
#include <fstream>
#include <iostream>
using namespace std;
#define FILE_PATH "fstream_test.txt"
void writeFile() {
ofstream ofs;
ofs.open(FILE_PATH, ios::out);
ofs << "This is a write file progream!" << endl;
ofs << "Hello CPP!" << endl;
ofs.close();
}
void readFile() {
ifstream ifs;
ifs.open(FILE_PATH, ios::in);
if (!ifs.is_open()) {
cout << "open file failed!" << endl;
return;
}
char data[1024] = {0};
while (ifs.getline(data, sizeof(data))) {
cout << data << endl;
}
ifs.close();
}
int main(int argc, char const* argv[]) {
writeFile();
readFile();
return 0;
}
fread/fwrite
文件操作用到fstream
类,但是用起来不舒服,还是fread/fwrite
好使,所以利用fread/fwrite
封装了一个类。
#ifndef __FILE_OPERATION_H__
#define __FILE_OPERATION_H__
enum FileOperationResult {
FOP_RES_SUCCESS = 0,
FOP_RES_INVALID_PARAM = -1,
FOP_RES_OPEN_FAILED = -2,
FOP_RES_MEMORY_OUT = -3,
FOP_RES_READ_WRITE_FILED = -4,
};
class FileOperation {
public:
int read(const char* filePath, char* data, unsigned int* dataLen);
int write(const char* filePath, const char* data, const unsigned int dataLen);
int readSeek(const char* filePath, char* data, unsigned int* dataLen, long int offset, int whence);
int writeAppend(const char* filePath, const char* data, const unsigned int dataLen);
};
#endif
#include "FileOperation.h"
#include <stdio.h>
int FileOperation::read(const char* filePath, char* data, unsigned int* dataLen) {
if (filePath == NULL || data == NULL || dataLen == NULL) {
return FOP_RES_INVALID_PARAM;
}
int result = FOP_RES_SUCCESS;
int fileLen = 0, readLen = 0;
/* open file */
FILE* fp = fopen(filePath, "rb+");
if (fp == NULL) {
return FOP_RES_OPEN_FAILED;
}
/* get file size */
fseek(fp, 0L, SEEK_END);
fileLen = ftell(fp);
fseek(fp, 0L, SEEK_SET);
/* check data memory length */
if (*dataLen < fileLen) {
result = FOP_RES_MEMORY_OUT;
goto exit;
}
/* read file */
readLen = fread(data, 1, fileLen, fp);
if (readLen <= 0 || readLen != fileLen) {
result = FOP_RES_READ_WRITE_FILED;
goto exit;
}
*dataLen = fileLen;
exit:
fclose(fp);
return result;
}
int FileOperation::write(const char* filePath, const char* data, const unsigned int dataLen) {
if (filePath == NULL || data == NULL || dataLen == 0) {
return FOP_RES_INVALID_PARAM;
}
int result = FOP_RES_SUCCESS;
int writeLen = 0;
/* open file */
FILE* fp = fopen(filePath, "wb+");
if (fp == NULL) {
return FOP_RES_OPEN_FAILED;
}
/* write file */
writeLen = fwrite(data, 1, dataLen, fp);
if (writeLen != dataLen) {
result = FOP_RES_READ_WRITE_FILED;
goto exit;
}
exit:
fclose(fp);
return result;
}
int FileOperation::readSeek(const char* filePath, char* data, unsigned int* dataLen, long int offset, int whence) {
if (filePath == NULL || data == NULL || dataLen == NULL) {
return FOP_RES_INVALID_PARAM;
}
int result = FOP_RES_SUCCESS;
int fileLen = 0, readLen = 0;
/* open file */
FILE* fp = fopen(filePath, "rb+");
if (fp == NULL) {
return FOP_RES_OPEN_FAILED;
}
/* get file size */
fseek(fp, 0L, SEEK_END);
fileLen = ftell(fp);
fseek(fp, offset, whence);
/* check data memory length */
if (*dataLen < fileLen) {
result = FOP_RES_MEMORY_OUT;
goto exit;
}
/* read file */
readLen = fread(data, 1, fileLen, fp);
if (readLen <= 0 || readLen > fileLen) {
result = FOP_RES_READ_WRITE_FILED;
goto exit;
}
*dataLen = fileLen;
exit:
fclose(fp);
return result;
}
int FileOperation::writeAppend(const char* filePath, const char* data, const unsigned int dataLen) {
if (filePath == NULL || data == NULL || dataLen == 0) {
return FOP_RES_INVALID_PARAM;
}
int result = FOP_RES_SUCCESS;
int writeLen = 0;
/* open file */
FILE* fp = fopen(filePath, "a");
if (fp == NULL) {
return FOP_RES_OPEN_FAILED;
}
/* write file */
writeLen = fwrite(data, 1, dataLen, fp);
if (writeLen != dataLen) {
result = FOP_RES_READ_WRITE_FILED;
goto exit;
}
exit:
fclose(fp);
return result;
}
测试代码
#include <cstring>
#include <iostream>
#include "FileOperation.h"
using namespace std;
#define FILE_PATH "test.txt"
void writeFile() {
const char* test_db = "This is a write file progream!";
FileOperation fop;
int result = fop.write(FILE_PATH, test_db, strlen(test_db));
cout << "writeFile result: " << result << endl;
}
void readFile() {
char* data = new char[1024];
unsigned int dataLen = 1024;
FileOperation fop;
int result = fop.read(FILE_PATH, data, &dataLen);
cout << "readFile result: " << result << " data: " << data << endl;
delete[] data;
}
void readFileSeek() {
char* data = new char[1024];
unsigned int dataLen = 1024;
FileOperation fop;
int result = fop.readSeek(FILE_PATH, data, &dataLen, 5, SEEK_SET);
cout << "readSeek result: " << result << " data: " << data << endl;
delete[] data;
}
void writeFileAppend() {
const char* test_db = "hello world!";
FileOperation fop;
int result = fop.writeAppend(FILE_PATH, test_db, strlen(test_db));
cout << "writeAppend result: " << result << endl;
}
int main(int argc, char const* argv[]) {
writeFile();
readFile();
readFileSeek();
writeFileAppend();
readFile();
return 0;
}
最后
以上就是单身大叔最近收集整理的关于C++文件操作的全部内容,更多相关C++文件操作内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复