如何在C中将文本文件读入矩阵形式

时间:2016-06-27 05:16:02

标签: c file matrix

给出以下文本文件,其中包含以下内容

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);
}

如果有些人可以帮我弄清楚如何实现我的目标那将是不错的。目前,我对如何进行感到困惑。

2 个答案:

答案 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()来依次获取每个部分。