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屯
就是多出现了“屯”,如果输入文件中有更多的内容,屯字也越多。怎么解决呢,求助大神们。 展开
我的源代码如下:
#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屯
就是多出现了“屯”,如果输入文件中有更多的内容,屯字也越多。怎么解决呢,求助大神们。 展开
展开全部
出问题的原因是你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);
你可以先不改然后把测试文件内容删到只剩下一行,就不会出这个问题
解决办法就是你可以定义一个额外的整数n来记录读到的字符数,并把下面2句改成这样:
/*把文件拷贝到buffer中*/
n=fread(buffer,1,lSize,pFile);
/*写入新文件中*/
fwrite(buffer,1,n,newFile);
你可以先不改然后把测试文件内容删到只剩下一行,就不会出这个问题
展开全部
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
fread() 和 fwrite() 用于2进制文件读写。
也就是说,你打开文件时,无论读还是写 要有选项 b, 例如 "rb","wb".
文本文件,按2进制方式打开,就会按2进制方法处理。
改正你的 fopen 里的 选项,就可解决问题。
也就是说,你打开文件时,无论读还是写 要有选项 b, 例如 "rb","wb".
文本文件,按2进制方式打开,就会按2进制方法处理。
改正你的 fopen 里的 选项,就可解决问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
应该是在 fread之后 fwrite之前加上一句话 buffer[ISize] = '\0';
出现 屯 的原因,是没找到结束符.
出现 屯 的原因,是没找到结束符.
追问
您好,我这样做了还是不对呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
buffer = (char*)malloc(sizeof(char)*( lSize +1)); //修改这一句
ZeroMemory(buffer ,sizeof(char)*( lSize +1)); //紧随其后加入这一句
试试看!!
ZeroMemory(buffer ,sizeof(char)*( lSize +1)); //紧随其后加入这一句
试试看!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询