【发布时间】:2012-10-22 23:51:16
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* getfield(char* line, int num) {
char* tok = line;
char* result;
if (line)
{
do
{
if (!--num)
{
tok = strchr(line, ',');
if (tok == NULL)
{
tok = &line[strlen(line)];
}
size_t fieldlen = tok - line;
if (fieldlen)
{
result = (char*)malloc(fieldlen+1);
result[fieldlen] = '\0';
strncpy(result, line, fieldlen);
return result;
}
else
{
break;
}
}
tok = strchr(line, ',');
line = tok + 1;
} while (tok);
}
result = (char*)malloc(2);
strcpy(result, "0");
return result;
}
int main()
{
FILE* stream = fopen("data.csv", "r");
char line[1024];
char *pstr;int num1,num2,num3;
char* value1,value2,value3;
while (fgets(line, 1024, stream))
{
char* tmp = strdup(line);
value1=getfield(tmp, 1);
value2=getfield(tmp, 2);
value3=getfield(tmp, 3);
num1 =strtol(value1,&pstr,10);
num2 =strtol(value2,&pstr,10);
num3 =strtol(value3,&pstr,10)
free(value1);
free(value2);
free(value3);
printf("Fields 1,2,3 would be 1=%d 2=%d 3=%d\n", num1,num2,num3);
// NOTE strtok clobbers tmp
free(tmp);
}
}
以上是我读取文件的C代码......
:::: data.csv ::::
10,34,30
10,33,
23,45,23
25,,45
上面是我的文件..
我的问题是我可以用“num”字段调用函数。因此,为了阅读每一行,我想调用该函数 3 次.. !!所以大型数据文件的性能太低了..有人可以帮助我,我可以立即调用该函数,它会返回一个数组..而不是我可以轻松存储和打印(例如,对于第一行数组 [0] =10,数组[1]=34,数组[2]=30)
【问题讨论】:
-
读取所有行并将它们合并为一个字符串,然后使用 split(',') 你将得到一个 string[] 存储你所有的数字
-
如果你以后不需要
line,你可以在逗号的位置写一个\0,然后返回一个指针数组到line缓冲区。不需要strncpy任何东西。 -
@BuiAkinori 这是C。没有
split(),也没有string[]。 -
@BartFriederichs :我听不懂你...任何代码更改?
-
我无法从 C 代码中更改 csv 文件!!!!!
标签: c file csv file-handling