我正在尝试解析C中的文件,该文件由一组数字组成(每行一个)。每组用逗号分隔。出于某种原因,我的输出结果不正确。
示例输入:1,2,4,8,55,777 输出:一堆似乎是内存地址的东西。当我打印掉字符串时,它不会读取55或777(或任何超过两位数的数字)。
int * parseFile(char *input, int *set, int line)
{
char buf[BUF_SIZE];
char *token = (char *) malloc(10 * sizeof(char));
int i;
FILE *f = fopen(input, "r");
for (i = 1; i < line; i++)
fgets(buf, BUF_SIZE, f);
memset(buf, 0, BUF_SIZE); // Clear the buffer.
i = 0;
if (fgets(buf, BUF_SIZE, f) != NULL) {
token = strtok(buf, ",");
set[i] = atoi(token);
i++;
while (set[i] != 0) {
printf("%d\n", set[i]);
set[i] = atoi(token);
i++;
token = strtok(NULL, ",");
}
}
fclose(f);
return set;
}
答案 0 :(得分:0)
在为其分配atoi的值之前,您正在打印set [i]的值。 考虑:
set[i] = atoi(token);
printf("%d,",set[i]);
while (set[i] != 0) {
i++;
set[i] = atoi(token);
printf("%d,",set[i]);
}
答案 1 :(得分:0)
我对此非常困惑:
set[i] = atoi(token); //i = 0
i++; //i = 1
while (set[i] != 0) { //set[1] = ???
printf(...set[i]);
set[i] = atoi(token);
i++;
...
所以,根据数组“set”的先前内容,您决定是否读取下一个值。所以,如果你做了一个“memset(set,0,sizeof(set));”你真的读了一行。如果你没有清除“设置”,如果你可能包含垃圾,你在读取下一个值之前“printf()”
答案 2 :(得分:0)
您可以使用fscanf()
将以下fscanf()
用于循环,直至到达文件末尾:
int a,b,c,d,e,x;
while (fscanf(f, " %d , %d , %d , %d, %d , %d", &a, &b, &c, &d, &e, &x) != EOF) {....}
答案 3 :(得分:0)
我喜欢这个
if (fgets(buf, BUF_SIZE, f) != NULL) {
token = strtok(buf, ",");
for (i=0; token != NULL; i++) {
set[i] = atoi(token);
// Optional: if (set[i] == 0) break; // I don't know why to stop on 0
printf("%d\n", set[i]);
token = strtok(NULL, ",");
}
}
休息有点难看,但它比
更好for(i = 0;(token!= NULL)&amp;&amp;((set [i] = atoi(token))!= 0); i ++){