鱼C论坛

 找回密码
 立即注册
查看: 2976|回复: 7

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

[复制链接]
发表于 2016-6-28 18:06:03 | 显示全部楼层 |阅读模式
100鱼币
本帖最后由 冥顽 于 2016-6-28 18:13 编辑
  1. //#include <stdio.h>
  2. #include <iostream>
  3. //#include <stdlib.h>

  4. using namespace std;

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

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

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

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

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

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

  20.         str=new char[filesize];                                                                //开堆
  21.         fread(str,sizeof(char),filesize,P_stream);                        //从P_stream读取文件内容
  22.        
  23.         fclose(P_stream);                                                                        //关闭P_stream3

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

  36.                 }
  37.                 else
  38.                 {
  39.                         cout<<"\n";
  40.                         break;
  41.                 }

  42.         }
  43.         //cout<<str<<endl;
  44.         delete []str;


  45.         //cout<<endl;
  46.         system("pause");
  47. }
复制代码


程序运行效果
效果.png
不单独判断换行输出的效果
错误.png
文件里面存在换行符,每两个换行符就会造成输出尾部输出一个乱码,单独判断换行把换行单独输出就没有这问题
想知道是什么原因

最佳答案

查看完整内容

原因是:windows下,文本文件的\n会转化为0d 0a,所以会占2个字符,而你输出的时候用了是一个字符,所以会剩下一些来输出乱码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-28 18:06:04 | 显示全部楼层
本帖最后由 DarkSE 于 2016-7-2 11:31 编辑
  1. //#include <stdio.h>
  2. #include <iostream>
  3. //#include <stdlib.h>

  4. using namespace std;

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

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

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

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

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

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

  20.         str=new char[filesize];             //开堆
  21.         fread(str,sizeof(char),filesize,P_stream);     //从P_stream读取文件内容
  22.         
  23.         fclose(P_stream);                              //关闭P_stream3

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

  36.                 //}
  37.                 //else
  38.                 //{
  39.                 //        cout<<"\n";
  40.                 //        break;
  41.                 //}
  42.                         cout<<str[i];  // 是说这么输出出现乱码吗?

  43.         }
  44.         //cout<<str<<endl;
  45.         delete []str;


  46.         //cout<<endl;   
  47.         system("pause");
  48. }
复制代码

原因是:windows下,文本文件的\n会转化为0d 0a,所以会占2个字符,而你输出的时候用了是一个字符,所以会剩下一些来输出乱码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-28 19:36:39 | 显示全部楼层
没人吗?????
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-30 10:43:16 | 显示全部楼层
这个好难啊,不会了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-3 22:32:56 | 显示全部楼层
DarkSE 发表于 2016-7-2 11:29
原因是:windows下,文本文件的\n会转化为0d 0a,所以会占2个字符,而你输出的时候用了是一个字符,所以会 ...

可是,当文本中内容很多的时候,乱码就会覆盖掉文件末尾的内容,导致内容显示不全。如果是换行占两字符,那么应该不会覆盖原有内容才对啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-7-6 11:58:15 | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

你截图一下覆盖文件末尾的内容是什么情况……我不会显示不全
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

最后那张图就是这种情况
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-15 10:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表