fscanf函数读取文本数据总是出错

l287343459 2014-01-02 07:01:28
文本数据可以读出来,但顺序总是乱的,比如我的数据是
0.632919 2.843643 1.025223 55 17 11 9
0.636337 2.841873 1.024307 20 14 9 6
0.635269 2.842697 1.023605 24 15 10 7
0.635330 2.842911 1.024857 52 15 10 7
0.632919 2.843643 1.025223 55 17 11 9
0.636337 2.841873 1.024307 20 14 9 6
0.632919 2.843643 1.025223 55 17 11 9
0.635330 2.842911 1.024857 52 15 10 7

读出来就变成了
0.632919 2.843643 55 55
0.636337 2.841873 52 20
0.635269 2.842697 1.023605 24
0.635330 2.842911 1.024857 52
0.632919 2.843643 1.025223 55
0.636337 2.841873 1.024307 20
0.632919 2.843643 1.025223 55
0.635330 2.842911 1.024857 52
六行数据则不会出错,行数越多则顺序越乱……
这是我的源代码:
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include"windows.h"
FILE *fp;
int main()
{
int i = 0, j = 0;
float x1[100000], y1[100000], z1[100000], fsl1[100000];
errno_t zhizhen;
zhizhen = fopen_s(&fp, "F:\\001.txt", "r");
if (zhizhen != 0)
printf("文件不能打开\n");
for (; fgetc(fp) != EOF; i++)
fscanf_s(fp, "%f%f%f%f", &x1[i], &y1[i], &z1[i], &fsl1[i]);
for (; j <i; j++)
printf("%f %f %f %f\n", x1[j], y1[j], z1[j], fsl1[j]);
getchar();

}
求教各位大大这是怎么回事啊
...全文
1511 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-01-03
  • 打赏
  • 举报
回复
ForestDB 2014-01-02
  • 打赏
  • 举报
回复
0.632919 2.843643 1.025223 55 17 11 9 fscanf_s(fp, "%f%f%f%f%*d%*d%*d", &x1[i], &y1[i], &z1[i], &fsl1[i]); 一个说明符读一个数字,四个%f就读到55,17...还在没读,下次就从17读起,又读四个; 计算机没你聪明,不会自动把17 11 9就略过从第二行开始读四个float 上面的红色代码,就是用来读17 11 9并丢弃,这样下次循环就是从第二行开始读了
vipcxj 2014-01-02
  • 打赏
  • 举报
回复
引用 2 楼 vipcxj 的回复:
会不会是你栈溢出了,你四个float数组用掉了1.6M,虽然貌似还不算太大,但我也不清楚你的栈到底有多大。。。
LZ,既然别人都帮你试过了,确实是栈溢出的问题,就快点结贴给分啦~
xyzinfernity 2014-01-02
  • 打赏
  • 举报
回复
楼上正解,如果是读前4个数那就是这样
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

FILE *fp;

int main()
{
int i = 0, j = 0;
float x1[100], y1[100], z1[100], fsl1[100];
errno_t zhizhen;
char buf[256];
zhizhen = fopen_s(&fp, "F:\\001.txt", "r");
if (zhizhen != 0)
{
printf_s("不能打开文件!\n");
}

for (; fgetc(fp) != EOF; i++)
{
fgets(buf, 256, fp);
sscanf_s(buf, "%f%f%f%f", &x1[i], &y1[i], &z1[i], &fsl1[i]);
}
for (; j <i; j++)
printf_s("%f %f %f %.0f\n", x1[j], y1[j], z1[j], fsl1[j]);

if (fp)
{
fclose(fp);
}

return 0;
}

图灵狗 2014-01-02
  • 打赏
  • 举报
回复
每行7个数,你却只读取了4个数,而且也没有处理换行符,这样当然会对不齐;建议你一行一行的读取,读取一行之后,再用fscanf去取4个数出来。
引用 楼主 l287343459 的回复:
文本数据可以读出来,但顺序总是乱的,比如我的数据是 0.632919 2.843643 1.025223 55 17 11 9 0.636337 2.841873 1.024307 20 14 9 6 0.635269 2.842697 1.023605 24 15 10 7 0.635330 2.842911 1.024857 52 15 10 7 0.632919 2.843643 1.025223 55 17 11 9 0.636337 2.841873 1.024307 20 14 9 6 0.632919 2.843643 1.025223 55 17 11 9 0.635330 2.842911 1.024857 52 15 10 7 读出来就变成了 0.632919 2.843643 55 55 0.636337 2.841873 52 20 0.635269 2.842697 1.023605 24 0.635330 2.842911 1.024857 52 0.632919 2.843643 1.025223 55 0.636337 2.841873 1.024307 20 0.632919 2.843643 1.025223 55 0.635330 2.842911 1.024857 52 六行数据则不会出错,行数越多则顺序越乱…… 这是我的源代码: #include "stdafx.h" #include "stdlib.h" #include "stdio.h" #include"windows.h" FILE *fp; int main() { int i = 0, j = 0; float x1[100000], y1[100000], z1[100000], fsl1[100000]; errno_t zhizhen; zhizhen = fopen_s(&fp, "F:\\001.txt", "r"); if (zhizhen != 0) printf("文件不能打开\n"); for (; fgetc(fp) != EOF; i++) fscanf_s(fp, "%f%f%f%f", &x1[i], &y1[i], &z1[i], &fsl1[i]); for (; j <i; j++) printf("%f %f %f %f\n", x1[j], y1[j], z1[j], fsl1[j]); getchar(); } 求教各位大大这是怎么回事啊
xyzinfernity 2014-01-02
  • 打赏
  • 举报
回复
我的电脑上是栈溢出了,于是把数组大小换成了100。
然后没什么问题啊,你的文件一行有7个数,你每次只读4个不知道意图是什么,这是我的结果图
vipcxj 2014-01-02
  • 打赏
  • 举报
回复
会不会是你栈溢出了,你四个float数组用掉了1.6M,虽然貌似还不算太大,但我也不清楚你的栈到底有多大。。。
l287343459 2014-01-02
  • 打赏
  • 举报
回复
@zhao4zhong1 求教各位大神~~

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧