C语言读入写出文件,写出文件时出现个别乱码。

我最近用C语言写了个简单的读入txt文件(test.txt),然后完全照原样写出为(new.txt),但是写出时,在代码的最后部分出现了“屯屯屯”这种乱码,不知道如何解决... 我最近用C语言写了个简单的读入txt文件(test.txt),然后完全照原样写出为(new.txt),但是写出时,在代码的最后部分出现了“屯屯屯”这种乱码,不知道如何解决。

我的源代码如下:
#include "stdafx.h" //这个必须放在第一行
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
FILE *pFile, *newFile;
long lSize;
char * buffer;
pFile = fopen("test.txt","r+");
if (pFile == NULL)
{
fputs("File error",stderr);
exit (1);
}
newFile = fopen("new.txt","w+");
if (newFile == NULL)
{
fputs("New file error",stderr);
exit (1);
}
/*获取文件大小*/
fseek(pFile,0,SEEK_END);
lSize=ftell(pFile);
rewind(pFile);
/*分配内存存储整个文件*/
buffer = (char*)malloc(sizeof(char)*lSize);
if (buffer == NULL)
{
fputs("Memory error",stderr);
exit(2);
}

/*把文件拷贝到buffer中*/
fread(buffer,1,lSize,pFile);
/*写入新文件中*/
fwrite(buffer,1,lSize,newFile);

fclose(pFile);
fclose(newFile);
free(buffer);
return 0;
}

————
测试时,输入文件为test.txt,内容是:
First111
Second222
Thrid333
但是输出文件new.txt内容为:
First111
Second222
Third333屯

就是多出现了“屯”,如果输入文件中有更多的内容,屯字也越多。怎么解决呢,求助大神们。
展开
 我来答
李金阳074
2015-04-01 · 超过48用户采纳过TA的回答
知道小有建树答主
回答量:103
采纳率:0%
帮助的人:96.8万
展开全部
出问题的原因是你ftell得到的长度和你fread实际读到的字节数不符,原因是windows把回车看作/r/n2个字符,ftell读的时候也按2个算,但是fread读的时候却算一个,就是\n ,这就导致你fwrite的时候比你fread到的要多。
解决办法就是你可以定义一个额外的整数n来记录读到的字符数,并把下面2句改成这样:

/*把文件拷贝到buffer中*/
n=fread(buffer,1,lSize,pFile);
/*写入新文件中*/
fwrite(buffer,1,n,newFile);

你可以先不改然后把测试文件内容删到只剩下一行,就不会出这个问题
tattackor
推荐于2017-10-14 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:895万
展开全部

1、C语言标准库提供了一系列文件操作函数。文件操作函数一般以f+单词的形式来命名(f是file的简写),其声明位于stdio.h头文件当中。例如:fopen、fclose函数用于文件打开与关闭;fscanf、fgets函数用于文件读取;fprintf、fputs函数用于文件写入;ftell、fseek函数用于文件操作位置的获取与设置。
2、例程:

#include<stdio.h>
int a;
char b,c[100];
int main(){
    FILE * fp1 = fopen("input.txt", "r");//打开输入文件
    FILE * fp2 = fopen("output.txt", "w");//打开输出文件
    if (fp1==NULL || fp2==NULL) {//若打开文件失败则退出
        puts("不能打开文件!");
        return 0;
    }
    fscanf(fp1,"%d",&a);//从输入文件读取一个整数
    b=fgetc(fp1);//从输入文件读取一个字符
    fgets(c,100,fp1);//从输入文件读取一行字符串
    
    printf("%ld",ftell(fp1));//输出fp1指针当前位置相对于文件首的偏移字节数
    
    fputs(c,fp2);//向输出文件写入一行字符串
    fputc(b,fp2);//向输出文件写入一个字符
    fprintf(fp2,"%d",a);//向输出文件写入一个整数
    
    fclose(fp1);//关闭输入文件
    fclose(fp2);//关闭输出文件,相当于保存
    return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
金色潜鸟
2015-04-02 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5733万
展开全部
fread() 和 fwrite() 用于2进制文件读写。
也就是说,你打开文件时,无论读还是写 要有选项 b, 例如 "rb","wb".
文本文件,按2进制方式打开,就会按2进制方法处理。
改正你的 fopen 里的 选项,就可解决问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
潮范君
2015-04-01 · 知道合伙人软件行家
潮范君
知道合伙人软件行家
采纳数:1440 获赞数:2874
从事软件开发工作一年有余,主要C++方向。

向TA提问 私信TA
展开全部
应该是在 fread之后 fwrite之前加上一句话 buffer[ISize] = '\0';
出现 屯 的原因,是没找到结束符.
追问
您好,我这样做了还是不对呢?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友0cc22311d
2015-04-02 · TA获得超过552个赞
知道小有建树答主
回答量:661
采纳率:100%
帮助的人:266万
展开全部
buffer = (char*)malloc(sizeof(char)*( lSize +1)); //修改这一句
ZeroMemory(buffer ,sizeof(char)*( lSize +1)); //紧随其后加入这一句

试试看!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式