作业帮 > 综合 > 作业

fscanf(fp,"%d",&x);该函数怎知每次读取多少字节长度的数据呢?是判断变量x的类型吗

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/21 10:48:04
fscanf(fp,"%d",&x);该函数怎知每次读取多少字节长度的数据呢?是判断变量x的类型吗
fscanf()函数不会知道要读多少字节的数据,碰到空格或者不匹配的字符才停止
比如文件内容是:
12345678912345
fscanf(fp,"%d",&x);
会读到这个数字结束导致x 溢出
如果文件内容是
123abc
或者是
123 234
那么x就是123
所以用fscanf()读取文件时要事先知道文件的数据组织方式
再问: 我想再问一下,当数据读到内存中的文件缓冲区内(全为二进制数据)时,系统读到像1234567asdf这种连续字符形式时,他并不知道a在内存中的二进制码值97其实是要表示'a'而不是整数97啊,那么1234567a就可能进入变量x中了(这里先不管overflow)等,所以我觉得这种匹配法则不应该啊,还是我们得先知道文件是以二进制或文本形式保存的,然后我们访问该文件即打开文件时我们指定以相应打开方式,接着编译系统可能对数据转换吗?
再答: 比如fscanf(fp,"%d",&x) 读取内存读到97,那就立即会停止,因为"%d"格式使得函数只会接收0x30--0x39的值,读到其他的肯定是不匹配的,函数设计的时候就是把读到的数据当ascii码看待,给x赋值的时候会把读到ascii序列转换为对应的数值 文本文件的概念祸害了好多人,实际上根本不存在所谓的文本文件格式,它就是个普通的二进制文件,一个文件内的数据按字节解释为ascii码(或者按二字节为单位解释为unicode),就是文本了,文本文件就是所有数据都是可显示的ascii码范围的文件,一个二进制文件以文本方式打开,就会把它的内容按字节解释为ascii码,