所以我正在阅读这种格式的文本文件:
ABC 51.555 31.555
DEF 23.445 45.345
我正在尝试使用 fscanf() 来解析数据,因为这个文件可能会增长或缩小,它需要以动态的方式加载,因此我使用 malloc 并且我也想将它存储在下面的结构中。我认为问题在于空格甚至可能没有正确编写整个格式说明符。这是我的代码。
typedef struct data
{
char name[4];
char lat[7];
char lng[7];
}coords;
int main(int argc, char *argv[])
{
////////////CREATES FILE POINTER/////////
FILE* fp;
///////////CREATES MALLOC POINTER TO STORE STRUCTS/////////////
coords* cp;
//////////OPENS FILE//////////
fp = fopen(argv[1], "r");
/////////GET THE TOTAL AMMOUNT OF LINES IN THE FILE/////////
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
rewind(fp);
//////SKIPS FIRST LINE//////////
while(fgetc(fp) != (int)'\n')
{};
/////////ASSIGNS MEMORY THE SIZE OF THE FILE TO //////////
cp = malloc(sizeof(coords) * size);
//////////READS FILE AND STORES DATA///////
fscanf(fp,"%s[^ ] %s[^ ] %s[^\n]", cp->name, cp->lat, cp->lng);
printf("%s\n%lf\n%lf\n", cp->name, cp->lat, cp->lng);
fclose(fp);
return 0;
}
是的,我知道我没有包含头文件,但我有正确的 stdlib 和 stdio
更新1:我已经尝试了两个回复,我在我的屏幕上得到了这个:
ABC51.555
0.000000
0.000000
为什么 51.555 没有转到结构中的下一项?谢谢
///////////////////////////////////////// ////////////更新2///////////////////////////// ///////////////////
好的,我已修改我的代码以执行以下操作。
typedef struct data
{
char name[4];
char lat[6];
char lng[6];
}coords;
int main(int argc, char *argv[])
{
////////////CREATES FILE POINTER/////////
FILE* fp;
///////////CREATES MALLOC POINTER TO STORE STRUCTS/////////////
coords* cp;
//////////OPENS FILE//////////
fp = fopen(argv[1], "r");
/////////GET THE TOTAL SIZE OF THE FILE/////////
fseek(fp, 0, SEEK_END);
long size = ftell(fp);
long lines = -1;
rewind(fp);
//////GETS TOTAL AMMOUNT OF LINES/////////
char c;
while(c != EOF)
{
c = fgetc(fp);
if(c == '\n')
{
lines++;
}
}
rewind(fp);
////////////SKIPS FIRST LINE//////////
while(fgetc(fp) != (int)'\n')
{};
/////////ASSIGNS MEMORY THE SIZE OF THE FILE TO //////////
cp = malloc(sizeof(coords) * size);
//////////READS FILE AND STORES DATA///////
printf("Lines of text read: %d\n", lines);
fscanf(fp,"%s %s %s[^\n]", cp[0].name, cp[0].lat, cp[0].lng);
printf("%s\n", cp[0].name);
fclose(fp);
return 0;
}
现在当我尝试打印 cp[0].name; 我得到了整个第一行,没有空格,就像这样。
ABC51.55531.555
如果我得到 print cp[0].lat; 我明白了。
51.55531.555
当我打印 cp[0].lng; 我明白了。
31.555
这是唯一正确的,我无法理解这种行为。为什么会这样?所有帖子都建议(正如我首先想到的那样) fscanf 中的每个 %s 都会将其放入自己的变量中,而不是将它们连接起来。如果我使用点表示法或直接表示法,则无关紧要 - >它仍然具有相同的结果。谢谢 :)