C++ 文件知识
阅读原文时间:2023年07月08日阅读:1

#include "iostream"
#include "filesystem"
#include "fstream"

#ifdef WIN32 //Windows
  #include
  #include
#else // Linux
  #include
  #include
  #include
  #include
  #include
#endif

int count = 0;
std::string Message = "";

//读取文件内容,C风格
int ReadFile(char* FileName, char** Buf, char* ResponseData)
{
FILE* fp = fopen(FileName, "rb");
if (!fp)
{
sprintf(ResponseData,"{\"data\":{},\"code\":\"1\".\"msg\":\"Missing\"}\r\n");
printf("%s",ResponseData);
return -1;
}
fseek(fp, 0, SEEK_END);//将指针移动到文件尾
int FileLen = ftell(fp);//获取文件长度
fseek(fp, 0, SEEK_SET);//将指针移动到文件头

char\* jsonstr = new char\[FileLen\];  
if (!jsonstr)  
{  
    sprintf(ResponseData, "{\\"data\\":{},\\"code\\":\\"1\\",\\"msg\\":\\"Memory Error\\"}\\r\\n");  
    printf("%s", ResponseData);  
    fclose(fp);  
    return -2;  
}  
memset(jsonstr, 0, FileLen);  
int rLen = fread(jsonstr, 1, FileLen, fp);  
if (rLen != FileLen)//rLen为读取到的长度,FileLen为文件长度  
{  
    sprintf(ResponseData, "{\\"data\\":{},\\"code\\":\\"1\\",\\"msg\\":\\"Load Json Error\\"}\\r\\n");  
    printf("%s", ResponseData);  
    fclose(fp);  
    delete\[\] jsonstr;  
    return -3;  
}  
\*Buf = jsonstr;  
fclose(fp);  
return 0;  

}

//读取文件内容,C++风格
void ReadFile(std::string FileName, std::string& out_Data, size_t& out_Size)
{
std::ifstream in_array_file;
in_array_file.open(FileName.c_str(), std::ios::in || std::ios::binary);
if (in_array_file.is_open())
{
unsigned char* buffer_bmp = nullptr;
unsigned int size_tmp = 0;

    /\*\*\*\*\*\*\*\*\*\*\*获取文件大小\*\*\*\*\*\*\*\*\*\*\*/  
    in\_array\_file.seekg(0, std::ios::end);  
    size\_tmp = in\_array\_file.tellg();  
    in\_array\_file.seekg(0, std::ios::beg);

    /\*\*\*\*\*\*\*\*\*\*\*读取文件\*\*\*\*\*\*\*\*\*\*\*/  
    buffer\_bmp = new unsigned char\[size\_tmp+1\];  
    if (buffer\_bmp != nullptr)  
    {  
        memset(buffer\_bmp, 0, size\_tmp + 1);  
        in\_array\_file.read((char\*)buffer\_bmp, size\_tmp);  
    }  
    in\_array\_file.close();

    /\*\*\*\*\*\*\*\*\*\*\*拷贝文件内容\*\*\*\*\*\*\*\*\*\*\*/  
    out\_Data = (char\*)buffer\_bmp;  
    out\_Size = out\_Data.length();

    if (buffer\_bmp != nullptr)  
    {  
        delete\[\] buffer\_bmp;  
    }  
}  

}

//在指定位置修改文件内容
void ReviseFile(std::string FileName, std::string Data,int Place)
{
//ofstream在打开文件时默认清空文件所有内容。如果使用ios::app来打开文件,虽然不会清空文件内容,但是每次写操作都追加到文件末尾,即使使用seekp也没用。
//fstream fs("D:/test.txt", ios::binary | ios::out | ios::app);//使用ios::app来打开文件
//fs.seekp(2, ios::beg);//跳转到开头的第二个字节位置进行写入。
//fs.write("!!!", 3);//写入三个!!!,最后发现还是写在结尾,即使seekp也没用
//fs.close();

//将文件打开模式ios::app替换为ios::in,这样可以保证文件内容不会被清空,且文件指针偏移操作有效。  
//fstream fs("D:/test.txt", ios::binary | ios::out | ios::in);//使用ios::in来打开文件  
//fs.seekp(2, ios::beg);//跳转到开头的第二个字节位置进行写入  
//fs.write("!!!", 3);//写入三个!!!,正常写入  
//fs.close();

//中间的位置必须使用feekp然后再写才能成功修改。并且seekp之后,如果继续读一些内容,再写也写不进去。必须seekp之后就写,才写的进去。  
std::fstream fs(FileName, std::ios::binary | std::ios::out | std::ios::in);  
fs.seekp(Place, std::ios::beg);  
fs.write(Data.c\_str(), Data.length());  
fs.close();  

}

//修改文件大小
void ReviseFile(std::string FileName, int Size)
{
//需要c++17标准库
//在100字节处进行截断,即只有100字节大小,多余100则多余部分舍弃,小于100则补0
//filesystem::resize_file("F:\\test.txt", 100);
std::filesystem::resize_file(FileName, Size);
}

//判断文件是否存在
bool IsFileExists(std::string FileName)
{ //C++17标准
if (std::filesystem::exists(FileName))
{
if (std::filesystem::is_directory(FileName))
{
printf("%s is a directory\n", FileName.c_str());
}
else if (std::filesystem::is_regular_file(FileName)) {
printf("%s is a file\n", FileName.c_str());
}
else
{
printf("%s exist\n", FileName.c_str());
}
return true;
}
else
{
printf("%s no exist\n", FileName.c_str());
return false;
}
}

bool CheckAndCreateFile(std::string FileName)
{
  FileName = FileName.substr(0, FileName.find_last_of('/'));
  std::cout << "filename:" << FileName.c_str() << std::endl;
  //判断该文件夹是否存在
  if (access(FileName.c_str(), 0) == -1)
  {
#ifdef WIN32
    int flag = mkdir(FileName.c_str()); //Windows创建文件夹
#else
    int flag = mkdir(FileName.c_str(), S_IRWXU); //Linux创建文件夹
#endif
  }
}

void main()
{
/***********从文件中读取数据***********/
std::ifstream fin("D:/test.txt");
fin >> count;
fin.close();
std::cout << count << std::endl;

count++;  
/\*\*\*\*\*\*\*\*\*\*\*写入数据到文件中\*\*\*\*\*\*\*\*\*\*\*/  
std::ofstream fout("D:/test.txt");  
fout << count << "," << ++count <<"\\n +";  
fout.close();

/\*\*\*\*\*\*\*\*\*\*\*删除文件\*\*\*\*\*\*\*\*\*\*\*/  
remove("D:/test.txt");              

std::ifstream \_fin("D:/data.txt");  
int a ,b; char c;  
/\*\*\*\*\*\*\*\*\*\*\*读取数据\*\*\*\*\*\*\*\*\*\*\*/  
\_fin >> a >> c >> b;  
std::cout << "a=" << a << std::endl;  
std::cout << "b=" << b << std::endl;  
std::cout << "c=" << c << std::endl;//c为,  
\_fin.close();

a++; b++;  
std::cout << "change a=" << a << std::endl;  
std::cout << "change b=" << b << std::endl;

//std::ofstream \_fout("d:/data.txt");//清空文件重新写入  
std::ofstream \_fout("d:/data.txt",std::ios::out|std::ios::app);;//在文件末尾追加内容  
\_fout << a << "," << b << "\\n";  
\_fout << "test" << "," << "\\n";  
\_fout << "test" << "," << "\\n";  
\_fout << "test" << "," << "\\n";  
\_fout.close();

/\*\*\*\*\*\*\*\*\*\*\*判断文件是否存在\*\*\*\*\*\*\*\*\*\*\*/  
IsFileExists("D:/data.txt");

/\*\*\*\*\*\*\*\*\*\*\*读取文件内容与大小\*\*\*\*\*\*\*\*\*\*\*/  
std::string data = "";  
size\_t length = 0;  
ReadFile("D:/data.txt",data,length);  
std::cout << "file\_data:" << data.c\_str() << std::endl;  
std::cout << "file\_length:" << length << std::endl;  

    CheckAndCreateFile("E:/TEST/test.txt");
}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章