【发布时间】:2015-12-30 15:02:19
【问题描述】:
我有兴趣阅读 .txt 文件并将其中的数据保存在 C 中的矩阵中。
dist.txt is the following:
Distance Amsterdam Antwerp Athens Barcelona Berlin
Amsterdam - 160 3082 1639 649
Antwerp 160 - 2766 1465 723
Athens 3082 2766 - 3312 2552
Barcelona 1639 1465 3312 - 1899
Berlin 649 723 2552 1899 -
事实上它有更多的城市,但没关系。
我想阅读这份文件并记录距离。我试过以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define rows 6
#define cols 6
int main()
{
FILE *nansa;
char *buffer;
int ret,row=0,i,j;
char delims[]=" \t";
char *result=NULL;
double **mat=malloc( rows*sizeof(double*) );
for(i=0; i<rows; i++)
{
mat[i]=malloc( cols*sizeof(double) );
}
if ((nansa=fopen("dist.txt","r"))==NULL)
{
fprintf(stdout, "Error\n");
return -1;
}
while(!feof(nansa))
{
buffer=malloc( sizeof(char)*4096 );
memset(buffer,0,4096);
ret=fscanf(nansa, "%4095[^\n]\n", buffer);
if(ret != EOF)
{
int field=0;
result=strtok(buffer,delims);
while(result != NULL)
{
if(field>4) break;
mat[row][field]=atof(result);
result=strtok(NULL,delims);
field++;
}
++row;
}
free(buffer);
}
fclose(nansa);
for(i=0; i<rows; i++)
{
for(j=0; j<cols; j++)
{
printf("%g%s", mat[i][j], j<cols-1 ? "\t" : "\n");
free(mat[i]);
}
}
free(mat);
return 0;
}
但我没有得到我想要的...而且我不知道如何区分名称和距离(字符和整数)。如果有人可以帮助我,我将不胜感激!
【问题讨论】:
-
什么文字或谁建议使用
while(!feof(...? -
... 看到这篇文章:stackoverflow.com/questions/5431941/…
-
buffer = malloc(4096);+memset(buffer, 0, 4096);+free(buffer);都在同一个循环中?为什么不分配一次缓冲区,只分配memset它,然后在循环外释放。或者更好:buffer[0] = '\0';和/或使用fgets? -
我建议通过使用
while(fgets(...) != NULL)读取每一行然后使用strtok从输入字符串中提取字段来避免错误使用feof。但是当你有一个像Los Angeles这样的多词城市时要小心。您最好重新考虑使用的字段分隔符,例如逗号或制表符。 -
发帖时说“如果有人能帮助我,我将不胜感激!”,在没有回复的情况下离开帖子一个小时,这看起来像是一种片面的帮助。