如何读取 c 中的文本文件,然后将每一行拆分为标记?
how to read a text file in c and then split each line into tokens?
输入文本文件每行有一些数字,数字被 space 分割。前两行只得到一个数字,后面几行得到三个。我想要做的是读取输入的每一行并存储这些数字。
这是我目前得到的:
int
main(int argc, char *argv[]) {
int n = 0;
char buff[MAX_STRING_LEN]; //MAX_STRING_LEN is defined as 64
while (fgets(buff,MAX_STRING_LEN, stdin) != NULL) {
char temp;
if (n == 0) {
sscanf(buff, "%s", &temp);
int h_num = (int)temp;
} else if (n == 1) {
sscanf(buff, "%s", &temp);
int s_num = (int)temp;
} else {
sscanf(buff, "%s", &temp);
char *token;
token = strtok(&temp, " ");
int i = 0;
int a,b,c;
while (token != NULL) {
if (i == 0) {
a = (int)token;
token = strtok(NULL, " ");
} else if (i == 1) {
b = (int)token;
token = strtok(NULL, " ");
} else {
c = (int)token;
token = strtok(NULL, " ");
}
i++;
}
}
n++;
}
return 0;
}
我用来测试代码的打印语句如下:
printf("%d\n",h_num);
printf("%d\n%d\n%d\n",a,b,c);
我创建了一个这样的文本文件:
23
34
4 76 91
但是输出不是我期望的,我认为是指针的地址。 (我又被指针卡住了=()
有人可以帮我指出问题所在吗?欣赏它。
在你的代码中,我可以看到,
int h_num = (int)temp;
和
int s_num = (int)temp;
不,这不是您将 字母数字字符串 转换为 int
的方式。
为此您需要使用 strtol()
。
然后,
sscanf(buff, "%s", &temp);
错了。 temp
是 char
,你必须为此使用 %c
。
我对更好方法的建议:
- 使用
fgets()
从文件中读取完整的一行
- 使用
strtok()
对输入进行分词,使用 space (</code>) 作为 <em>delimiter</em>,然后使用 <a href="http://linux.die.net/man/3/strtol" rel="nofollow"><code>strtol()
将标记(如果不是 NULL)转换为 int
- 继续直到返回的令牌为 NULL
在这种情况下,您的代码将更加通用,因为不需要单独考虑数量 int
出现在每行中。
输入文本文件每行有一些数字,数字被 space 分割。前两行只得到一个数字,后面几行得到三个。我想要做的是读取输入的每一行并存储这些数字。
这是我目前得到的:
int
main(int argc, char *argv[]) {
int n = 0;
char buff[MAX_STRING_LEN]; //MAX_STRING_LEN is defined as 64
while (fgets(buff,MAX_STRING_LEN, stdin) != NULL) {
char temp;
if (n == 0) {
sscanf(buff, "%s", &temp);
int h_num = (int)temp;
} else if (n == 1) {
sscanf(buff, "%s", &temp);
int s_num = (int)temp;
} else {
sscanf(buff, "%s", &temp);
char *token;
token = strtok(&temp, " ");
int i = 0;
int a,b,c;
while (token != NULL) {
if (i == 0) {
a = (int)token;
token = strtok(NULL, " ");
} else if (i == 1) {
b = (int)token;
token = strtok(NULL, " ");
} else {
c = (int)token;
token = strtok(NULL, " ");
}
i++;
}
}
n++;
}
return 0;
}
我用来测试代码的打印语句如下:
printf("%d\n",h_num);
printf("%d\n%d\n%d\n",a,b,c);
我创建了一个这样的文本文件:
23
34
4 76 91
但是输出不是我期望的,我认为是指针的地址。 (我又被指针卡住了=() 有人可以帮我指出问题所在吗?欣赏它。
在你的代码中,我可以看到,
int h_num = (int)temp;
和
int s_num = (int)temp;
不,这不是您将 字母数字字符串 转换为 int
的方式。
为此您需要使用 strtol()
。
然后,
sscanf(buff, "%s", &temp);
错了。 temp
是 char
,你必须为此使用 %c
。
我对更好方法的建议:
- 使用
fgets()
从文件中读取完整的一行
- 使用
strtok()
对输入进行分词,使用 space (</code>) 作为 <em>delimiter</em>,然后使用 <a href="http://linux.die.net/man/3/strtol" rel="nofollow"><code>strtol()
将标记(如果不是 NULL)转换为 - 继续直到返回的令牌为 NULL
int
在这种情况下,您的代码将更加通用,因为不需要单独考虑数量 int
出现在每行中。