我正在尝试做Read co-ordinates from a txt files using C Program所做的事情。我尝试输入的数据采用以下格式:
f 10 20 21
f 8 15 11
. . . .
f 11 12 25
我的点结构的唯一区别是我有一个额外的字符来存储第一列中的字母(可能是也可能不是字母f)。我想我要么宣布我的错误,要么我在printf
错误地称呼它。无论哪种方式,我只读取第一行,然后我的程序终止。有什么想法吗?
以下是我的MWE
#define FILEPATHtri "/pathto/grid1DT.txt"
#define FILEPATHorg "/pathto/grid1.txt"
#define MAX 4000
#include <stdio.h>
#include <stdlib.h>
#include "math.h"
typedef struct
{
float x;
float y;
float z;
char t[1];
}Point;
int main(void) {
Point *points = malloc( MAX * sizeof (Point) ) ;
FILE *fp ;
fp = fopen( FILEPATHtri,"r");
int i = 0;
while(fscanf(fp, "%s %f %f %f ", points[i].t, &points[i].x, &points[i].y, &points[i].z ) == 4 )
{
i++;
}
fclose(fp);
int n;
for (n=0; n<=i; n++){
printf("%c %2.5f %2.5f %2.5f \n", points[i].t, points[n].x, points[n].y, points[n].z ); }
printf("There are i = %i points in the file \n And I have read n = %i points ",i,n);
return 0;
}
答案 0 :(得分:8)
因为那里只有一个字符,所以不是字符串只需在代码中使用一个字符:
char t;
}Point;
然后当你阅读时:
while(fscanf(fp, "%c %f %f %f ", &points[i].t, &points[i].x, &points[i].y, &points[i].z ) == 4 )
{
我会注意到,在一个结构的末尾有一个包含1个字符的数组,可以为struct hack设置一个可能不是你的意图......只使用{{{ 1}}而不是char t
这一行:
char t[1]
应该是
for (n=0; n<=i; n++){
最后一个注意事项......如果您想要打印出底部打印件中的字符,那么您应该使用for (n=0; n<i; n++){
:
n
答案 1 :(得分:0)
检查
while(fscanf(fp, "%c %f %f %f ", points[i].t, &points[i].x, &points[i].y, &points[i].z ) == 4 )
{
i++;
}
fclose(fp);
int n;
for (n=0; n<i; n++){
printf("%c %2.5f %2.5f %2.5f \n", points[n].t, points[n].x, points[n].y, points[n].z ); }
printf("There are i = %i points in the file \n And I have read n = %i points ",i,n);
getch();
return 0;
}
修改是因为在printf中只有一个字符被%s
修改为%c
,而不是points[i].t
其points[n].t
。此外,for循环中的限制检查也会更正为n<i