C/C++对文件的读写

本文介绍了使用C/C++语言进行文件读写的多种方法。包括使用C语言标准库函数如fopen、fread、fwrite等进行文件操作的过程,并展示了如何利用C++标准库中的ifstream和ofstream实现文件的读取与写入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C/C++对文件的读写

学习在于总结

c/c++语言的相似度非常大。不管从事哪一个方向的开发,对c/c++都应该有了解,因为它们是操作系统的开发语言。了解它们对任何开发都是有好处的。
因为c++兼容c语言,所以c语言对文件的读取,c++都是可以运用的。当然c++也有专用于它的文件读写,更加的方便 和简单。

c语言对文件的读写

#include <iostream>
#include <stdio.h>

using namespace std;

void readFile();
void writeFile();

int main()
{
    //读取文件内容
    readFile();

    //向文件写入内容
    writeFile();

    return 0;
}


void readFile()
{
    char fileName[256] = { 0 };
    FILE* file;

    while(true)
    {  
        cout << "please input fileName:";
        cin >> fileName;
        cout <<fileName<<endl;
        if((file = fopen(fileName,"r")) == NULL)//“r”为读取文件内容,如果不存在文件则返回null,详细见下面的writeFile()方法
        {
           cout <<"Error!!"<<endl;
           continue;
        }
        //导航到文件末尾
         fseek(file,0,SEEK_END);
         //得到文件的字节数
         int l = ftell(file);
         //回到文件开头
         //fseek(file,0,SEEK_SET);//用fseek定位到文件开头
         rewind(file);//回到文件起始位置

         //输出文件的长度
         cout<<l<<endl;

         //用fscanf循环输出文件中的内容
         /*for(int i = 0; i < l; i++)
         {
            char ch;
            fscanf(file,"%c",&ch);
            cout << ch;
         }
         */


         //用feof函数来判断文件是否指向末尾
         //因为用feof进行判断文件是不是结束的时候,当指针指向最后一个字符的时候,依然存在字符,所以不会认为是文件最后,会继续向后面多读取一个字符。
         //只有当指针指向的地方没有东西或者乱码时,才会认为是指向了最后。所以往往会多读取一个字符,最后多读取的字符往往为乱码,读取之后,才能知道是文件最后了,但是也要读,所以是乱码。这个乱码字符已经读取了。
         //因为无法阻止它多读,所以只能不让最后一个乱码输出,来解决多输出一个字符的问题。所以用下面代码来表示:
         cout << "feof" <<endl;
          char ch;
         fscanf(file,"%c",&ch);//先读取一个字符,让文件指针指向第一个字符,即指针向后移动一位。因为刚开始指针不指向第一个字符,而是指向第一个字符前面,文件头
         while(!feof(file))//首先判断读取的第一个字符的位置是不是文件结束,不是的话则进入循环,输出第一个字符(然后在向后读取一位,让指针向后移动,指向读取的这一位,然后判断这一位是不是空,是的话则结束,说明这一位读出来的内容是乱码)。
                           //是的话则结束,则说明读取的内容是乱码,文件是空文件,也不用输出了,因为会是乱码。
         {
             cout <<ch;
             fscanf(file,"%c",&ch);
         }


         /*
         //用fread读取文件中的内容,块读取
         //fileContent储存读出来的内容
         char* fileContent = new char[l];
         fread(fileContent,l,1,file);//fileContent为储存内容的数组;l为读取字节的长度;1表示只读取一边;file为文件的指针
         //输出内容
         cout << fileContent <<endl;
         */

         /*
         //得到一个字节
         //因为用feof进行判断文件是不是结束的时候,当指针指向最后一个字符的时候,依然存在字符,所以不会认为是文件最后,会继续向后面多读取一个字符。
         //只有当指针指向的地方没有东西时,才会认为是指向了最后。所以往往会多读取一个字符,最后多读取的字符往往为乱码,读取之后,才判断出来是文件最后了,但是这个乱码字符已经读取了。
         //因为无法阻止它多读,所以只能不让最后一个乱码输出,来解决多输出一个字符的问题。所以用下面代码来表示:
         char ch  = fgetc(file);
         while(!feof(file));
         {
             cout << ch;
             ch = fgetc(file);
         }
         */

         /*
         //读取一个字符串
         char* fileContent = new char[l];
         fgets(fileContent,l,file);//fileContent为储存读取内容的数组,l为读取的最大长度,file为读取的文件的指针
         cout << fileContent;
         */
         cout <<endl;
         fclose(file);
         break;
     }

}

void writeFile()
{
    char fileName[256] = { 0 };
    FILE* file;
    while(true)
    {
        cout << "please input fileName:";
        cin >> fileName;

        file = fopen(fileName,"a");//"r"打开文本文件进行读写,不存在,则返回NULL
                            //"a"如果存在文件,则在文件末尾加入内容,如果不存在则新建文件。
                            //“w”如果存在文件,则将文件删除,从新创建。如果不存在则新建文件。
                            //“r+”打开文本文件进行读/写,如果不存在则返回NULL
                            //“w+”建立新文本文件进行读/写,如果存在文件,则将文件删除,从新创建。如果不存在则新建文件
                            //“a+”如果存在文件,则向文件末尾追加读/写,如果不存在则新建文件进行读/写(用a+最后可能多输入几个乱码字符,原因未知)
        //读取文件目前具有的字符个数
        fseek(file,0,SEEK_END);
        int l = ftell(file);
        cout << "begin:" << l << endl;
        fseek(file,0,SEEK_SET);//还可以用rewind(file);


        /*
        //以fprintf的方式向文件写内容
        char ch[10]={'b','b','b','b','b','b','b','b','b','b'};
        fprintf(file,"%s",ch);
        printf("%s",ch);
        */

        /*
        //以fputc的方式向文件写入一个字符
        char ch = 'a';
        fputc(ch,file);//ch为要写入的字符,file为文件指针
        */

        /*
        //以fputs的方式向文件写入一个字符串
        char ch[10]={'b','b','b','b','b','b','b','b','b','b'};
        fputs(ch,file);//ch为要写入的字符串,file为文件指针
        */

        //以fwrite的方式向文件写入内容块
        char ch[10]={'b','b','b','b','b','b','b','b','b','b'};
        long lenth = 10l;
        int  count = 2;
        fwrite(ch,lenth,count,file);//ch为要写入的内容,lenth为写入内容的大小,count为写入次数,可以写入多次,file为写内容的文件指针

        //读取文件最后的字符个数
        fseek(file,0,SEEK_END);
        int l1 = ftell(file);
        cout << "end:" << l1 << endl;
        fseek(file,0,SEEK_SET);

        fclose(file);//关闭文件
    }
}

c++对文件的读写

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void readFile();
void writeFile();

int main()
{
   // readFile();
    writeFile();
}

void readFile()
{
   char fileName[255] = {0};

   while(true)
   {
      cout << "please input fileName:";
      cin >> fileName;

      ifstream in; //输入流
      in.open(fileName);//打开文件
      if(in == NULL)
      {
          cout << "Error!!"<< endl;
          continue;
      }

      in.seekg(0,ios::end);//从结束位置开始计算偏移量,“ios::cur”从当前位置开始计算偏移量
      int len = in.tellg ();
      cout << len << endl;
      in.seekg(0,ios::beg);//从文件开始位置开始计算偏移量


      //read方式读取文件内容
      /*
       //读取全部内容
      char* fileContent = new char[len];
      in.read (fileContent,len);//fileContent存储读取的内容,len为读取的长度
      cout << fileContent << endl;
      */
      /*
      //读取一个字符
      char* ch = new char[1];
      in.read(ch,1);
      cout <<ch <<endl;
      */

      //getLine方式读取一行
      /*
      //方法1:
      string str;
      getline(in,str);
      cout <<str<<endl;
      */

      /*
      //方法2:
      char* fileContent = new char[len-5];
      in.getline (fileContent,len-5);
      cout <<fileContent<<endl;
      */

      /*
      //读取单个字符
      char ch;
      for(int i = 0; i < len; i++)
      {
         in >> ch;
         cout << ch;
      }
      */

      /*
      //读取字符串
      string st ;
      in >> st;
      cout<<st;
      */

      //读取一个字符数组
      char ch[len] = {0};
      for(int i = 0; i <len ;i++)
      {
          in >> ch[i];
          cout << ch[i];
      }


      cout << endl;


      in.close();

   }
}

void writeFile()
{
    char fileName[255] = {0};
    cout << "please input fileName:";
    cin >> fileName;

    ofstream out;
    out.open(fileName);
    if(out == NULL)
    {
        cout << "Error!!"<<endl;
        return ;
    }

    while(true)
    {
        /*
        //向文件写入单个字符
        char ch = 'c';
        out << ch;
        */

        /*
        //向文件写入数组
        char ch[10] = {'a','b','c','d','e','f','j','f','g','h'};
        out << ch;
        */

        /*
        //向文输出字符串
        string str = "123456";
        out <<str;
        */

        /*
        //以write方式向文件写内容
        char ch[10] = {'1','2','3','4','5','6','7','8','9','0'};
        out.seekp (0,ios::end);//定位到文件末尾写入
        out.write (ch,10);//ch为要写入的内容,10为写入的长度
        */

        //向文件写入一个字符
        char ch = 'b';
        out.put(ch);//输入一个字符
        break;

    }
    out.close();

}

总结

以上内容就是我总结的 文件读取。如果不全,以后会补充完整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值