给出以下文本文件,其中包含以下内容
SpotA B C
SpotB pass D
Spotc A E F
如何将单词分解为标记并将其存储在10 x 10矩阵中。 请注意,如果文件中的内容是小于10 x 10的矩阵大小,我想将字符〜添加到这些位置。
到目前为止,这是我的代码:
char *matrix[10][10];
int loadFileToMatrix(char *filename){
FILE *fp;
int row = 0;
int col= 0;
char *tokens;
char buffer[1000];
fp = fopen(filename,"r");
if(fp == NULL){
perror(filename);
return(1);
}
while((fgets(buffer, sizeof(buffer), fp))!= NULL) {
tokens = strtok(buffer," ");
map[row++][col++] = tokens;
}
return(0);
}
如果有些人可以帮我弄清楚如何实现我的目标那将是不错的。目前,我对如何进行感到困惑。
答案 0 :(得分:1)
只需使用fscanf
从文件到缓冲区读取令牌,然后将令牌复制到矩阵map
中。您可以使用fgetc
来检测它是否到达行尾和文件末尾。
char ch;
while (1) {
fscanf(fp, "%s", buffer);
matrix[row][col] = (char *)malloc(sizeof(char) * (strlen(buffer) + 1));
strcpy(matrix[row][col], buffer);
ch = fgetc(fp);
if (ch == ' ') {
col += 1;
}
else if (ch == '\n') {
row += 1;
col = 0;
}
else if (ch == EOF) {
break; // end of file.
}
}
答案 1 :(得分:0)
strtok()是一个奇怪的功能。
手册页的关键部分是:
"On the first call to strtok() the string to be parsed should be specified in str. In each subsequent call that should parse the same string, str should be NULL."
原因是strtok()改变了传递它的字符串。它搜索字符串,直到找到与其中一个分隔符匹配的下一个字符,然后用空终止符替换该分隔符。如果在位置n处找到分隔符,则在内部,strtok()将位置n + 1保存为字符串其余部分的开头。
通过第二次使用非null值调用strtok,你告诉函数在该字符串的开头重新开始,并再次尝试找到一个它永远不会做的分隔符,因为它已经找到了第一个。相反,您对strtok()的第二次调用应该将NULL作为第一个参数传递,因此每次传递都可以显示下一个标记。
如果由于某种原因你需要同时在多个字符串上调用strtok(),你将覆盖内部保存的地址;只有最近的通话才能正确保存。在这种情况下,重入函数strtok_r()非常有用。
如果您不确定如何使用函数,那么手册页是最好的资源。您可以在命令行键入man strtok
,甚至只是谷歌。
看起来,在这种情况下,你只使用strtok()一次。这将只返回缓冲区的第一部分的地址,由分隔符分隔。你需要在循环中调用strtok()来依次获取每个部分。