C语言中CSV到2D数组的转换
这对我来说是一个非常有趣的错误,因为一小时前这段代码还可以正常工作,但现在不行了 从本质上讲,下面一行的第一个“块”的第一个字符被追加为最后一个“块”的最后一个字符 其中“block”是指该行/列中的字符串 例如,假设数组应该是C语言中CSV到2D数组的转换,c,C,这对我来说是一个非常有趣的错误,因为一小时前这段代码还可以正常工作,但现在不行了 从本质上讲,下面一行的第一个“块”的第一个字符被追加为最后一个“块”的最后一个字符 其中“block”是指该行/列中的字符串 例如,假设数组应该是 1,2,3,Hello 4,5,6,Wonder 它被解读为 1,2,3,Hello4, 6,Wonder, , 这是我一直使用的逻辑。我真的不知道发生了什么变化,所以任何建议都是非常好的 tableFile = fopen(argv[4], "r"); //
1,2,3,Hello
4,5,6,Wonder
它被解读为
1,2,3,Hello4,
6,Wonder, ,
这是我一直使用的逻辑。我真的不知道发生了什么变化,所以任何建议都是非常好的
tableFile = fopen(argv[4], "r");
//pulling the table data from the file
char tableArray[30][50][256];
char c;
int i=0, j=0, k=0;
while(c != EOF){
c = fgetc(tableFile);
switch(c)
{
case ',':
tableArray[i][j++][k]='\0';
k=0;
break;
case '\n':
tableArray[i++][j][k]='\0';
j=0;
k=0;
break;
case '\r':
break;
case EOF:
break;
default:
tableArray[i][j][k++] = c;
break;
}
} //end file transfer
//Just to display, ignore magic numbers as (mostly) irrelevant
int a, b;
for (a = 0; a < 20; a++)
{
for (b = 0; b < 47; b++)
{
printf ("%s", tableArray[a][b]);
if (b<46)
printf (", ");
}
printf ("\n");
}
fclose(tableFile);
tableFile=fopen(argv[4],“r”);
//从文件中提取表数据
字符表数组[30][50][256];
字符c;
int i=0,j=0,k=0;
而(c!=EOF){
c=fgetc(表格文件);
开关(c)
{
案例',':
tableArray[i][j++][k]='\0';
k=0;
打破
案例“\n”:
tableArray[i++][j][k]='\0';
j=0;
k=0;
打破
案例'\r':
打破
案例EOF:
打破
违约:
tableArray[i][j][k++]=c;
打破
}
}//结束文件传输
//只是为了显示,忽略魔术数字(大部分)是不相关的
INTA,b;
对于(a=0;a<20;a++)
{
对于(b=0;b<47;b++)
{
printf(“%s”,表数组[a][b]);
如果(b)
您没有初始化数组。数组不能保证为零填充。添加
memset(tableArray,0,sizeof(tableArray))
案例EOF:
必须在最近的字符串中添加一个NULL
终止符
这真的是由于我的原始帖子下面的评论。但是,尽管这是一种令人厌恶且糟糕的编码形式……但这是始终如一地解决它的原因,并不是因为我为此感到自豪……而且我仍然愿意接受各种想法:
tableFile = fopen(argv[4], "r");
//pulling the table data from the file, lazy magic numbers here...
char tableArray[30][50][256];
char c;
int i=0, j=0, k=0;
memset(tableArray, 0, sizeof(tableArray));
while(c != EOF){
c = fgetc(tableFile);
switch(c)
{
case ',':
tableArray[i][j++][k]='\0';
k=0;
break;
case '\n':
tableArray[i++][j][k]='\0';
j=0;
k=0;
break;
case '\r':
tableArray[i++][j][k]='\0';
j=0;
k=0;
break;
case EOF:
tableArray[i][j][k] = '\0';
break;
default:
tableArray[i][j][k++] = c;
break;
}
} //end file transfer
/* //Only relevant for displaying the tableArray
int a, b;
for (a = 0; a < 20; a++)
{
for (b = 0; b < 47; b++)
{
printf ("%s", tableArray[a][b]);
if (b<46)
printf (", ");
}
printf ("\n");
}
*/
fclose(tableFile);
tableFile=fopen(argv[4],“r”);
//从文件中提取表数据,这里是惰性幻数。。。
字符表数组[30][50][256];
字符c;
int i=0,j=0,k=0;
memset(tablerarray,0,sizeof(tablerarray));
而(c!=EOF){
c=fgetc(表格文件);
开关(c)
{
案例',':
tableArray[i][j++][k]='\0';
k=0;
打破
案例“\n”:
tableArray[i++][j][k]='\0';
j=0;
k=0;
打破
案例'\r':
tableArray[i++][j][k]='\0';
j=0;
k=0;
打破
案例EOF:
tableArray[i][j][k]='\0';
打破
违约:
tableArray[i][j][k++]=c;
打破
}
}//结束文件传输
/*//仅与显示tableArray相关
INTA,b;
对于(a=0;a<20;a++)
{
对于(b=0;b<47;b++)
{
printf(“%s”,表数组[a][b]);
如果(b自工作以来发生了什么变化?你不能回到工作版本吗?你没有源代码控制吗?如果没有,为什么没有?否则你如何在做出潜在的破坏性变化之前跟踪工作代码?@Marcus我正在Mac终端上用gcc编译。在我的系统上运行良好,除了输出20x47矩阵和很明显,除了依赖于中的c
的随机初始值,而(c!=EOF)
@phihag-Bah…我担心我会听到这个。我的csv文件是否有可能被破坏或以某种方式变形?!@Marcus Mac OSX是Unix,因此使用\n
.1。这不是问题(如果存储了正确的边界)因为他正在正确地结束写入的字符串。另外,c
不应该是char
;当然,它应该是int
。