我想从文件中读取一些数字,目的是将它们放入名为int
的“多维” point
数组中。我想将文件的每一行放在第一维元素中,并将strtok
传递的每个子字符串放在放置匹配行的维度的“子元素”中。
我通过运行两个封装的for循环来做到这一点,第一个按时间顺序从文件中获取每一行,第二个借助strtok
拆分行并将其存储在char*
中数组,以后再用int
将其转换为strtol
。
除了第一个分隔的字符串外,其他所有分隔的字符串都可以正常工作。无论文件中该位置实际有多少数字,文件第一行中的第一个子字符串始终会保存为0。 任何想法可能导致此问题?我一直在找几个小时,但无法解决。
通过故障排除,我得出的结论是,strtok()
的第一次调用很可能出了点问题。但这对我来说很好。
void pointvalue() {
char **substr = malloc(3 * sizeof(char*));
int point[5][3];
char buffer[20];
char*endpos;
FILE *pf = fopen("PATH", "r");
if (pf != NULL) {
for(int i = 0; fgets(buffer, 20, pf); i++) {
for(int k = 0; k < 3; k++) {
if (k == 0) substr[k] = strtok(buffer, ";");
else {
substr[k] = strtok(NULL, ";");
}
point[i][k] = strtol(substr[k], &endpos, 0);
printf("%d ",point[i][k]);
}
}
} else {
perror("Couldn`t load file");
}
}
在文件中两行数字带有定界符“;”被写。 示例:
3;4;5;
6;9;2;
我编写的函数可以打印:
0 4 5 6 9 2
编辑:这是我使用时打印出的内容:
printf("[%s] %d\n",substr[k],point[i][k]);
[´╗┐3] 0[4] 4[5] 5[6] 6[9] 9[2] 2
答案 0 :(得分:0)
int point[5][3];
...
for(int i = 0; fgets(buffer, 20, pf); i++) {
...
point[i][k] = strtol(substr[k], &endpos, 0);
...
}
虽然这可能不是问题的根源,但请注意,程序很容易将其写入内存中的随机位置,从而导致未定义的行为。
如果for
被执行5次以上,就会发生这种情况:i
将指向point
之外。
答案 1 :(得分:0)
您的问题很可能是由于输入文件包含一个初始字节序列(称为BOM)(用于字节顺序标记),应该表明文件内容是UTF-8编码的字节流。
您应该配置文本编辑器以避免产生这样的指示符,或者修改程序以使其忽略。
请注意,应通过限制从文件读取的行数来防止缓冲区溢出,并且也应关闭文件。
这是您的函数的简化版本:
void pointvalue() {
int point[5][3] = {{ 0 }};
char buffer[128];
FILE *pf = fopen("PATH", "r");
if (pf != NULL) {
/* skip an initial BOM in the text file */
scanf(pf, "%*1[\xEF]%*1[\xBB]%*1[\xBF]");
for (int i = 0; i < 5 && fgets(buffer, sizeof buf, pf); i++) {
k = sscanf(pf, "%d;%d;%d", &point[i][0], &point[i][1], &point[i][2]);
for (int j = 0; j < k; j++) {
printf("%d ", point[i][k]);
}
printf("\n");
}
fclose(pf);
} else {
perror("Couldn't load the PATH file");
}
}