C语言中指针读写文件,问什么记事本都是乱码,怎么改呢?

作者&投稿:朱点 (若有异议请与网页底部的电邮联系)
C语言,文件读写操作为什么输出的是乱码?求网友指点!~

因为程序里用的是:fread(&a[i],sizeof(int),1,fp);
这里每次读入4个字节,而因为是这个文件里保存的都是字符,每个字符占一个字节,所以实际上第一次是把 10 _ 0 _ 四个字符,拼成了一个4字节的整数,并且保存在了a[0]里面。

造成这种情况的原因就是,存储在文件中的text,是文本,一般不用fread来读。

可以修改为fscanf(fp, "%d", &a[i]);

这是编码问题。
编译软件的编辑器的编码,确定是gb2312 或 gb18030
c语言源文件的编码,确定是gb2312 或 gb18030
file1.txt文件的编码,确定是ANSI,或gb2312 gb18030
你把编码都统一到一个,就可以了。

从代码看,在Windows平台是有大概率会乱码,假如你的商品信息数组里存放了换行就一定会乱码。

主要问题在文件的打开方式不对,fread, fwrite函数最好以二进制模式打开文件,即打开方式加上b,即(rb, wb)。在unix/Linux系统应该没问题。以下是问题解释:

二进制和文本模式的区别

1.在windows系统中,文本模式下,文件以""代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"
"时,函数会自动在"
"前面加上""。即实际写入文件的是"" 。

2.在类Unix/Linux系统中文本模式下,文件以"
"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别。

扩展资料

ffopen为C语言编程中所需的一个常用语言,多数用来打开文件。其调用的一般形式为:文件指针名=fopen(文件名,使用文件方式);其中,‘’文件指针名”必须是被说明为FILE 类型的指针变量,文件名”是被打开文件的文件名;“使用文件方式”是指文件的类型和操作要求。“文件名”是字符串常量或字符串数组。

基本介绍函数功能:打开一个文件函数原型:FILE * fopen(const char * path,const char * mode);相关函数:open,fclose,fopen_s,_wfopenfopen所需库:返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno 中。一般而言,打开文件后会做一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以一般在fopen()后作错误判断及处理。

参数说明:参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。

mode有下列几种形态字符串:

r 以只读方式打开文件,该文件必须存在。

r+ 以可读写方式打开文件,该文件必须存在。

rb+ 读写打开一个二进制文件,允许读写数据。

rw+ 读写打开一个文本文件,允许读和写。

w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)

a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)

wb 只写打开或新建一个二进制文件;只允许写数据。

wb+ 读写打开或建立一个二进制文件,允许读和写。ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。



先说下错误。
读取,文件是用a+方式打开,这读取数据,因为文件指针在最末的关系,读取出来的数据是空的,所以n永远为0。
其次,在写数据前,没有fclose文件就再fopen一次,这是正确的文件操作方式?
最后,老实说,看你的代码头很痛,不是说代码很难,而是这个格式实在太难看,很多时候,一看到这种混乱的代码,直接看都不看就关掉的。在诸多IDE的今天,写一段格式整齐的代码很难么,不要跟我说你是用windows记事本写代码的。

最最后,下面是整理并修改正确的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#ifndef MAX_NUM
#define MAX_NUM 100
#endif

typedef struct student
{
char num[11];
int math;
int eng;
int chin;
int ave;
int totle;
}stu;

void main()
{
stu a[MAX_NUM];
int i = 0, n = 0, k = 0;
FILE *fp = fopen("e:\\student.txt","rb+");
for(n = 0; fp && fread(&a[n], 1, sizeof(stu), fp) != 0; ++n) ;
printf("请输入要添加的信息");
printf("\n请输入第%d个学生信息:\n",n + 1);
printf("学号:\n");
scanf("%s",a[n].num);
printf("math成绩:\n");
scanf("%d",&a[n].math);
printf("english成绩:\n");
scanf("%d",&a[n].eng);
printf("chin成绩:\n");
scanf("%d",&a[n].chin);
a[n].totle=a[n].math+a[n].eng+a[n].chin;
a[n].ave=a[n].totle/3;
for(k = n-1; k >= 0; k--)
{
if(strcmp(a[k].num,a[n].num) == 0)
{
printf("该学生已经存在,请重新输入");
break;
}
}
if(fp == NULL && (fp = fopen("e:\\student.txt","wb")) == NULL)
{
printf("open file error!\n");
exit(0);
}
fseek(fp, 0, SEEK_SET);
for(i = 0; i <= n; i++)
fwrite(&a[i], 1, sizeof(a[0]), fp);
fclose(fp);
}

你是想让第一个作为帐号,第二个为密码吗fgets你指定了大小100,而且没有那么多字符能读取,所以它把整个文件中的所有字符都读取了,包含空格,gets()也一样


c语言中读文本文档如何让文件指针换到下行首
while(1) { c = fgetc(fp); if(c == EOF) return EOF;\/\/到文件尾,不存在下一行 if(c == '\\n') break;\/\/读到需要的换行符。 } return 0;}在读取中,FILE*指针会自动完成移位,所以不需要显式的返回指针。

c语言操作文本的基本使用方法
c语言操作文本应该怎么使用,这对于很多新手来说,是很难的一件事情,下面我为大家带来了关于c语言操作文本的基本使用方法,欢迎大家阅读!c语言操作文本的基本使用方法 1.字符读写:fgetc函数的功能是从指定的文件中读一个字符,函数调用的形式为:字符变量=fgetc(文件指针);fputc函数的功能是把一个字...

用c语言编写从文件读入一个班学生三门课(语文、数学、外语)的成绩,用...
\/\/ 当前学生数组中学生的个数struct student stu[MAX]; \/\/ 学生数组}dd;\/\/ 显示主菜单void menu(){system("cls");\/\/清屏 printf("\\n\\n\\n");printf("\\t\\t\\t ***\\n");printf("\\t\\t\\t \\n");printf("\\t\\t\\t 学生成绩管理系统 \\n");printf("\\t\\t\\t \\n");p...

c语言 指针可以存到文件里面吗
链表是一种内存中的数据结构,写入文件时,直接按链表顺序将各节点元素的值写到文件里;从文件中读元素时,再按照文件中的信息重新构建每个节点并连接成链表。不可能把链表本身写到文件里。

C语言文件指针的几个问题
就在<stdio.h>中定义的.属于全局的变量,生存期位从该文件处开始,知道文件结尾处结束.内存中一般使用4个字节存储在静态存储区.

请问一下汇编语言中的西东文件读写指针中的 (CX):(DX)=位移是什么意思...
移动文件指针 CX:DX CX存储高位,DX存储低位,二者构成的位移表示开始读或写的位置

C语言中文件打开时读写指针是不是不管打开方式什么都再文件首
是的,默认在文件首!

C语言读取文件数据
这个串定义的长一点,保证够用就行。举例:char str[1024]。fgets( str , sizeof(str), fp ),\/\/fp打开的文件指针。然后调用for循环去读取串的的数据,假设你的分隔符是空格,遍历str,遇到空格就得到一个数据,然后继续遍历,直到str尾。再去fgets数据,再遍历,即可得到所有的数据。

c语言 文件指针的问题
注意这里定义中,nmemb的含义 也请参照fread的定义:定义函数 size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);函数说明 fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr 指向欲存放读取进来的数据空间,读取的字符数以参数size*nmemb来决定。Fread()会返回...

C语言怎样一行一行读文件?
C语言可以通过fgets函数一次读一行数据。fgets函数原型如下:char *fgets(char *buf, int bufsize, FILE *stream);参数 说明 buf: 字符型指针,指向用来存储所得数据的地址。bufsize: 整型数据,指明存储数据的大小。stream: 文件结构体指针,将要读取的文件流。fgets函数注意细节如下:从文件结构体指针...

芝山区19677393188: 怎么样用c语言的文件指针向一个新建的记事本写入东西 -
城盾银杏: 示例://---------------------------------------------------------------------------#include <stdio.h>int main(void){ int i; FILE *fp=fopen("c;\\a.txt","w");/*打开c:\a.txt文件以写入数据,如果不存在,就新建这个文件,后面的"w"表示是向文件写入数据*/if(fp){ ...

芝山区19677393188: 在C语言中文件有几种操作类型 -
城盾银杏: 主要是两种文件类型:1)文本文件,2)二进制文件.一般来说,人类可读的文件都作为文本文件,例如一片文章.其余都作为二进制文件,例如一个程序.在C语言中,文件的操作是通过FILE结构体进行了,利用fopen返回一个指向FILE结构...

芝山区19677393188: 解决后加分.c语言读取文件后怎么用记事本显示 -
城盾银杏: if(IDOK==fileDlg.DoModal()) {CString command = "notepad "system( command + fileDlg.GetFileName() ); }

芝山区19677393188: 在C语言中要用到write和read函数要用到什么头文件 -
城盾银杏: 1、要用到unistd.h头文件.2、 Write函数用法:write函数所在的头文件为 <unistd.h>write有两种用法.一种是:ssize_twrite(int handle, void *buf, int nbyte);handle 是文件描述符;buf是指定的缓冲区,即指针,指向一段内存单元;nbyte是...

芝山区19677393188: 如何用C语言读写文件
城盾银杏: 一个c语言读写文件程序: #include "stdio.h" #include &lt;stdlib.h&gt; main() { FILE *fp1;//定义文件流指针,用于打开读取的文件 FILE *fp2;//定义文件流指针,用于打开写操作的文件 char text[1024];//定义一个字符串数组,用于存储读取的...

芝山区19677393188: 怎样用c语言编写程序实现从文件(记事本)读入数据? -
城盾银杏: #include <stdio.h> void main( void ) { FILE *stream; char list[30]; int i, numread, numwritten; if( (stream = fopen( "C:\\my.txt", "r+t" )) != NULL ) { numread = fread( list, sizeof( char ), 25, stream ); printf( "读取数据长度 = %d\n", numread ); list[...

芝山区19677393188: C语言的文件操作 -
城盾银杏: 你觉得文件的打开 / 关闭应该长啥样.运行另一个程序(比如说对于 .doc 文件,运行 MS Word),然后把内容交给另一个程序处理(例如,对于 .doc 文件,让 MS Word 显示文件内容)?那建议你思考一下,你的程序是干什么用的

芝山区19677393188: C语言文件读写的函数参数里的文件指针的位置有些在前面,有些有后面,有没有什么助记的方法啊 -
城盾银杏: 一般的读写函数把FILE类型参数作为最后一个.如果是变长参数的则放到第一个.非读写函数一般是把FILE类型参数作为第一个.你可以看下stdio.h里面有FILE类型参数的函数.这个需要花时间记的.

芝山区19677393188: C语言中先读写文件还是先定义指针 -
城盾银杏: 选C.如下 FILE *fp; fp = fopen(参数); fprintf(....); fscanf(....); fclose(fp); 请采纳,谢谢

芝山区19677393188: 1.用电脑的右键单击,新建,文本文档,就是记事本吧? 2.用这个记事本可以建c语言的程序吗?3.如 -
城盾银杏: 1. 新建的是文本文档,和记事本无关,只不过大多数电脑默认使用记事本打开文本文件而已. 2. 用记事本可以编写C语言程序的代码,因为代码本身就是文本文件.但记事本肯定不能完成程序,因为无法编译和调试. 3. 代码就是文本,学会了C语言直接在记事本里面写也可以,但说实话,初学者别这样做. 4. 新建的文本文档,是TXT格式.放到手机里面不会改变格式. 5. 显示后缀名是系统浏览器功能,在文件管理器工具菜单的“文件夹选项”中可以设置.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网