我有一个.csv文件,看起来像
Config,Prob,MAN,ATL,CVERT,TVERT,LVERT,PELV,SAC,RIB,SCAP,PHUM,DHUM,PRAD,DRAD,CARP,PMC,DMC,PHX,PFEM,DFEM,PTIB,DTIB,TARS,PMT,DMT
LH,1,2,2,7,13,6,2,1,13,2,2,2,1,1,6,2,2,24,2,2,2,2,8,2,2
LH,1,0,0,0,0,0,0,0,9,1,2,2,2,2,12,2,2,18,1,1,1,1,4,1,1
LH,1,2,2,7,3,0,2,1,3,1,1,1,1,1,6,1,1,6,0,0,0,0,0,0,0
LH,1,0,0,0,13,6,2,1,8,0,2,2,1,1,0,0,0,0,0,0,0,0,0,0,0
LH,1,2,2,4,13,6,2,1,18,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0
LH,1,0,0,0,13,6,2,1,18,2,2,2,0,0,0,0,0,0,2,2,0,0,0,0,0
LH,3,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
LH,1,0,0,0,13,6,2,1,24,2,2,2,2,2,12,2,2,24,2,2,2,2,8,2,2
LH,1,0,0,1,13,3,2,1,15,2,0,0,2,2,0,0,0,6,2,2,2,2,0,0,0
LH,1,0,0,0,0,0,0,0,10,0,1,1,0,0,0,0,0,18,0,0,0,0,0,0,0
LH,1,0,2,7,3,0,0,0,7,2,2,2,2,2,12,2,2,24,2,2,2,2,8,2,2
LH,1,0,0,2,0,0,0,0,14,1,2,2,2,2,0,0,0,18,2,2,2,2,0,0,0
LK,1,0,0,0,0,0,0,0,13,0,0,0,1,1,6,0,0,0,0,0,0,0,0,0,0
LK,1,2,2,7,13,6,2,1,17,1,0,0,0,0,0,0,0,6,1,1,1,1,4,1,1
LK,1,0,0,0,10,6,0,0,23,1,1,1,1,1,6,1,1,18,2,2,2,2,8,2,2
LK,1,2,2,7,0,0,0,0,18,2,0,0,1,1,12,2,2,24,2,2,2,2,8,2,2
LK,1,0,0,3,0,0,0,0,8,0,0,0,2,2,12,2,2,24,2,2,2,2,8,2,2
LK,1,2,2,7,0,0,0,0,8,0,0,0,2,2,12,2,2,24,0,0,2,2,8,2,2
LK,3,2,2,7,13,6,2,1,22,2,2,2,2,2,12,2,2,24,2,2,2,2,8,2,2
LK,1,2,2,7,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
LK,1,2,2,6,0,3,0,0,11,0,2,2,0,0,12,2,2,18,0,0,0,0,8,2,2
LK,1,2,2,7,13,6,2,1,16,2,1,1,2,2,12,2,2,6,2,2,2,2,8,2,2
LK,1,2,0,0,10,6,2,1,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
LK,1,2,2,5,13,6,2,1,12,1,0,0,0,0,12,2,2,6,0,0,0,0,8,2,2
我想忽略文本,只取数字。这是我的代码:
int arr[rows][columns]; /* rows/columns of .csv file */
char buf[1000];
int r = 0;
while (fgets(buf,1000,ifp)) {
char read = 'N';
const char *tok;
int ret =0;
int c = 0;
int count = 0;
char *ptr;
printf("%s \n", buf);
for (tok = strtok(buf, ","); tok && *tok; tok = strtok(NULL, ",\n")){
printf("%s ", buf); /* replace buf with tok */
if(isNumber(tok)==1){
read = 'Y';
ret = strtol(tok,&ptr,10);
arr[r][c] = ret;
c++;
printf("Entered ");
//printf("%ld ", arr[r][c]);
}
if(strtok(NULL,"\n") && read == 'N')
count++;
}
r++;
//r -= count;
}
isNumber
本质上是isdigt
的扩展,并按预期工作。但是,每当每次迭代打印出tok
时,它都会在第一个逗号之后停止。样本输出:Config LH LH LH LH LH LH LH LH LH LH LH LH LK LK LK LK LK LK LK LK LK LK LK LK
。使用fgets
似乎可以很好地读取输入内容,因为它会打印出.csv文件的每一行。所以看来问题出在我的for循环上。看来我不正确地增加了令牌。
尝试另一个示例:
char alph[] = "a-b-c-e";
for (const char *tok = strtok(alph, "-"); tok && *tok; tok = strtok(NULL, "-\0")){
printf("%s ", tok);
}
产量:
a b c e
,这是正确的结果。
因此,我感觉我在解析文件时缺少某些东西。任何帮助表示赞赏。谢谢。
答案 0 :(得分:1)
您的循环是:
for (tok = strtok(buf, ","); tok && *tok; tok = strtok(NULL, ",\n"))
{
…omitted…
if (strtok(NULL, "\n") && read == 'N')
count++;
}
您有3个对strtok()
的呼叫,而if
中的1个呼叫占用了换行符。我不确定你在想什么。看来您应该忽略strtok()
-但我不确定您需要用什么替换它。
由于循环控件中的第二个调用读取达换行符或逗号(strtok(NULL, ",\n")
),因此您无法确定何时到达行尾,除非将tok
设置为{{ 1}}表示没有更多令牌。