冥顽 发表于 2016-6-28 18:06:03

c中读取文本并输出带换行会在末尾输出乱码

本帖最后由 冥顽 于 2016-6-28 18:13 编辑

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

using namespace std;

int main()
{
        FILE *P_stream;                                   //定义文件类型的指针
        fopen_s(&P_stream,"1.txt","r");           //打开文件将文件地址赋给P_stream指针变量                               
        if(P_stream==NULL)                           //判断文件是否成功打开,如果成功打开P_stream指向文件首地址,如果打开失败则输出提示信息并退出                                  程序
        {

                fprintf(stdout,"文件打开失败,请确认文件是否存在!\n");
                exit(0);
        }

        fseek(P_stream,0,SEEK_END);                                                  //将文件内部指针移动到文件末尾以计算文件的大小,否则ftell获取不到文件大小

        size_t filesize=ftell(P_stream);                                        //定义存储文件大小的变量
                                                                                                                //ftell函数返回文件大小赋给变量filesize

        //rewind(P_stream);                        //和下一条语句功能一样
        fseek(P_stream,0,SEEK_SET);        //将文件内部指针移动到文件开头

        char *str=NULL;                                                                                //定义指向新申请内存的指针

        str=new char;                                                                //开堆
        fread(str,sizeof(char),filesize,P_stream);                        //从P_stream读取文件内容
       
        fclose(P_stream);                                                                        //关闭P_stream3

        P_stream=NULL;                                                                                //将P_stream指针设置为空
        int count=0;                                                                                //定义一个整形变量保存换行符计数
        for(unsigned int i = 0;i<filesize;i++)                                //循环输出文件内容
        {
                if(str=='\n'||str=='\r')                                        //判断字符是否为换行符,如果是换行则计数加1,
                {                                                                                                //并输出换行,换行符不单独输出,最后会输出一串乱码(用二进制方式打开文件就不存在此问题)
                        count+=1;                                                                               
                        cout<<str;
                }
                else if(i<=(filesize-count))                                        //判断文件结束,文件大小,减掉换行符数量
                {       
                        cout<<str;

                }
                else
                {
                        cout<<"\n";
                        break;
                }

        }
        //cout<<str<<endl;
        delete []str;


        //cout<<endl;
        system("pause");
}

程序运行效果

不单独判断换行输出的效果

文件里面存在换行符,每两个换行符就会造成输出尾部输出一个乱码,单独判断换行把换行单独输出就没有这问题
想知道是什么原因

DarkSE 发表于 2016-6-28 18:06:04

本帖最后由 DarkSE 于 2016-7-2 11:31 编辑

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

using namespace std;

int main()
{
      FILE *P_stream;                     //定义文件类型的指针
      fopen_s(&P_stream,"1.txt","r");   //打开文件将文件地址赋给P_stream指针变量                              
      if(P_stream==NULL)                  //判断文件是否成功打开,如果成功打开P_stream指向文件首地址,如果打开失败则输出提示信息并退出程序
      {

                fprintf(stdout,"文件打开失败,请确认文件是否存在!\n");
                exit(0);
      }

      fseek(P_stream,0,SEEK_END);      //将文件内部指针移动到文件末尾以计算文件的大小,否则ftell获取不到文件大小

      size_t filesize=ftell(P_stream);   //定义存储文件大小的变量
                                           //ftell函数返回文件大小赋给变量filesize

      //rewind(P_stream);                //和下一条语句功能一样
      fseek(P_stream,0,SEEK_SET);      //将文件内部指针移动到文件开头

      char *str=NULL;                     //定义指向新申请内存的指针

      str=new char;             //开堆
      fread(str,sizeof(char),filesize,P_stream);   //从P_stream读取文件内容
      
      fclose(P_stream);                              //关闭P_stream3

      P_stream=NULL;                                  //将P_stream指针设置为空
      int count=0;                                    //定义一个整形变量保存换行符计数
      for(unsigned int i = 0;i<filesize;i++)          //循环输出文件内容
      {
                //if(str=='\n'||str=='\r')          //判断字符是否为换行符,如果是换行则计数加1,
                //{                                       //并输出换行,换行符不单独输出,最后会输出一串乱码(用二进制方式打开文件就不存在此问题)
                //      count+=1;                                                                              
                //      cout<<str;
                //}
                //else if(i<=(filesize-count))            //判断文件结束,文件大小,减掉换行符数量
                //{      
                //      cout<<str;

                //}
                //else
                //{
                //      cout<<"\n";
                //      break;
                //}
                        cout<<str;// 是说这么输出出现乱码吗?

      }
      //cout<<str<<endl;
      delete []str;


      //cout<<endl;   
      system("pause");
}
原因是:windows下,文本文件的\n会转化为0d 0a,所以会占2个字符,而你输出的时候用了是一个字符,所以会剩下一些来输出乱码

冥顽 发表于 2016-6-28 19:36:39

没人吗?????

wstxh 发表于 2016-6-30 10:43:16

这个好难啊,不会了

冥顽 发表于 2016-7-3 22:32:56

DarkSE 发表于 2016-7-2 11:29
原因是:windows下,文本文件的\n会转化为0d 0a,所以会占2个字符,而你输出的时候用了是一个字符,所以会 ...

可是,当文本中内容很多的时候,乱码就会覆盖掉文件末尾的内容,导致内容显示不全。如果是换行占两字符,那么应该不会覆盖原有内容才对啊

xhbsingle 发表于 2016-7-6 11:58:15

学习

DarkSE 发表于 2016-7-6 13:19:49

冥顽 发表于 2016-7-3 22:32
可是,当文本中内容很多的时候,乱码就会覆盖掉文件末尾的内容,导致内容显示不全。如果是换行占两字符, ...

你截图一下覆盖文件末尾的内容是什么情况……我不会显示不全{:5_92:}{:5_92:}

冥顽 发表于 2016-7-7 16:14:11

DarkSE 发表于 2016-7-6 13:19
你截图一下覆盖文件末尾的内容是什么情况……我不会显示不全

最后那张图就是这种情况
页: [1]
查看完整版本: c中读取文本并输出带换行会在末尾输出乱码