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-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个字符,而你输出的时候用了是一个字符,所以会剩下一些来输出乱码 没人吗?????
这个好难啊,不会了 DarkSE 发表于 2016-7-2 11:29
原因是:windows下,文本文件的\n会转化为0d 0a,所以会占2个字符,而你输出的时候用了是一个字符,所以会 ...
可是,当文本中内容很多的时候,乱码就会覆盖掉文件末尾的内容,导致内容显示不全。如果是换行占两字符,那么应该不会覆盖原有内容才对啊 学习 冥顽 发表于 2016-7-3 22:32
可是,当文本中内容很多的时候,乱码就会覆盖掉文件末尾的内容,导致内容显示不全。如果是换行占两字符, ...
你截图一下覆盖文件末尾的内容是什么情况……我不会显示不全{:5_92:}{:5_92:} DarkSE 发表于 2016-7-6 13:19
你截图一下覆盖文件末尾的内容是什么情况……我不会显示不全
最后那张图就是这种情况
页:
[1]