我想读取一个包含字符串和数字混合的文件,并将其存储到二维数组中。条件是第一行,第一列应作为我的2d数组的索引。这是示例文件。
xx,yy
aaa,10,11
bbb,12,13
ccc,14,15
ddd,16,17
eee,18,19
要清楚,我如何将字符串作为索引,我的数组应该给我这样的值
array[aaa][xx] = 10
array[bbb][yy] = 13... etc.,
这是我的方法
FILE* fp1 = fopen("test.csv","r");
if(fp1 == NULL)
{
printf("Failed to open file\n");
return 1;
}
char s[1] = ",";
fscanf(fp1,"%[^\n]",array); // Read first row alone
token = strtok(array,s);
while( token != NULL )
{
strArray[i] = strdup(token); // First row stored in strArray[i]
strcpy(strArray[i], token);
token = strtok(NULL, s);
i++;
}
i=0;
while((fscanf(fp2,"%[^,],%[^,],%[^\n]\n",Col1,Col2,Col3)>0)) // Reading File Column wise
{
Column_1[i][j]= strdup(Col1);
Column_2[j]= atof(Col2);
Column_3[j]=atof(Col3);
j=j+1;
}
for(i=0;i<1;i++)
{
for(j=0;j<=5;j++)
{
myArray[i][j] = Column_2[j];
}
}
for(i=1;i<2;i++)
{
for(j=0;j<=5;j++)
{
myArray[i][j] = Column_3[j]; // Column 2 & 3 values stored in myArray[i][j]
}
}
现在在第一列和第一行中搜索必需字符串并获取索引并使用索引在myArray [i] [j]中搜索以获取值。它工作得很好,但我觉得我的代码有点复杂。我正在寻找更简单的代码。有人可以建议吗。
先谢谢, 西瓦
答案 0 :(得分:1)
由于我的知识有限,我真的不认为你可以声明char
类型的二维数组并取int
个值。相反,我建议去结构。
这是一个到结构的链接::(http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Structures)
另一个天真的解决方案是静态声明第一行和第一列,将输入作为字符并通过atoi()
函数将其转换为整数。
答案 1 :(得分:0)
FILE* fp1 = fopen("test.csv","r");
if(fp1 == NULL)
{
printf("Failed to open file\n");
return 1;
}
char s[1] = ",";
fscanf(fp1,"%[^\n]",array); // Read first row alone
token = strtok(array,s);
while( token != NULL )
{
strArray[i] = strdup(token); // First row stored in strArray[i]
strcpy(strArray[i], token);
token = strtok(NULL, s);
i++;
}
i=0;
while((fscanf(fp2,"%[^,],%[^,],%[^\n]\n",Col1,Col2,Col3)>0)) // Reading File Column wise
{
Column_1[i][j]= strdup(Col1);
Column_2[j]= atof(Col2);
Column_3[j]=atof(Col3);
j=j+1;
}
for(i=0;i<1;i++)
{
for(j=0;j<=5;j++)
{
myArray[i][j] = Column_2[j];
}
}
for(i=1;i<2;i++)
{
for(j=0;j<=5;j++)
{
myArray[i][j] = Column_3[j]; // Column 2 & 3 values stored in myArray[i][j]
}
}
printf("\n\nEnter Row_name to search\t");
scanf("%s", Row_name);
printf("\nEnter Column_name to search\t");
scanf("%s", Column_name);
for(i=0;i<1;i++)
{
for(j=0;j<=5;j++)
{
if(strcmp(Row_name,Column_1[i][j]) == 0)
{
i_index = j;
}
}
}
for(i=0;i<3;i++)
{
if(strcmp(Column_name,strArray[i]) == 0)
{
j_index = i;
}
}
printf("\nValue[%s][%s] is '%f'",Row_name,Column_name,myArray[j_index-1][i_index] );
fclose(fp1);
return 0;
}
答案 2 :(得分:0)
我今天使用的方法是:
string[][] values = new string[2][];//string = open value|new string = fill value
int i = 0;
while (!sr.EndOfStream)
{
strline = sr.ReadLine();
values[i] = strline.Split(',');//'i' is row 1
i++;// this is row too
} };
}
sr.Close(); // Release the file.
Console.WriteLine(values[0][0]);//test your code with this value for row1 and column1