鱼C论坛

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

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

[复制链接]
发表于 2016-6-28 18:06:03 | 显示全部楼层 |阅读模式
100鱼币
本帖最后由 冥顽 于 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[filesize];                                                                //开堆
        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[i]=='\n'||str[i]=='\r')                                        //判断字符是否为换行符,如果是换行则计数加1,
                {                                                                                                //并输出换行,换行符不单独输出,最后会输出一串乱码(用二进制方式打开文件就不存在此问题)
                        count+=1;                                                                                
                        cout<<str[i];
                }
                else if(i<=(filesize-count))                                        //判断文件结束,文件大小,减掉换行符数量
                {        
                        cout<<str[i];

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

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


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

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

最佳答案

查看完整内容

原因是:windows下,文本文件的\n会转化为0d 0a,所以会占2个字符,而你输出的时候用了是一个字符,所以会剩下一些来输出乱码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[filesize];             //开堆
        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[i]=='\n'||str[i]=='\r')          //判断字符是否为换行符,如果是换行则计数加1,
                //{                                       //并输出换行,换行符不单独输出,最后会输出一串乱码(用二进制方式打开文件就不存在此问题)
                //        count+=1;                                                                                
                //        cout<<str[i];
                //}
                //else if(i<=(filesize-count))            //判断文件结束,文件大小,减掉换行符数量
                //{        
                //        cout<<str[i];

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

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


        //cout<<endl;    
        system("pause");
}
原因是:windows下,文本文件的\n会转化为0d 0a,所以会占2个字符,而你输出的时候用了是一个字符,所以会剩下一些来输出乱码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-6-28 19:36:39 | 显示全部楼层
没人吗?????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-30 10:43:16 | 显示全部楼层
这个好难啊,不会了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

可是,当文本中内容很多的时候,乱码就会覆盖掉文件末尾的内容,导致内容显示不全。如果是换行占两字符,那么应该不会覆盖原有内容才对啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-6 11:58:15 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

你截图一下覆盖文件末尾的内容是什么情况……我不会显示不全
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

最后那张图就是这种情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 04:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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