我有一个文件.txt,其编码如下:
Alpha-Beta-Gamma-Delta-Epsilon
Zeta-Eta-Theta-Iota-Kappa-Lamda-Mi
Ni-Ksi-Pi-Ro-Sigma
我想阅读这些单词并将它们存储在一个数组中。
我用fscanf(fp, "%[^-]", word)
但是当我把fscanf
放进去的时候,它会继续读同一个单词。如果我把它放在while语句中,它就不会重复。
重点是将每个单词从Alpha分别读到Sigma
我为您提供了一个最小可验证的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
FILE *fp;
char *word = (char*)malloc(40);
int count = 0;
char* Words[30]; //max 30
fp = fopen("MyWords.txt","r"); //read only
int r = 1;
while(1){
if(fscanf(fp, "%[^-]", word) == EOF) break;
printf("%s",word);
}
fclose(fp);
return 0;
}
注意:我不想修改文件。另外我应该如何处理\n
字符
答案 0 :(得分:4)
使用宽度说明符39限制输入,比word
可用的40个字节小1,因为fscanf()
将附加空字符。只要成功返回fscanf()
,就继续阅读1.使用以下分隔符:'-'
或'\n'
,
while(fscanf(fp, "%39[^-\n]", word) == 1) {
printf("<%s>\n",word);
fscanf(fp, "%*[-\n]"); // consume delimiter, no need to save.
}
注意:使用[^-\n]
而不是[^\n-]
,因为-
稍后会看起来像 scan-set 范围不完整的开头。
答案 1 :(得分:1)
上面的答案很好,如果您不想在代码中使用正则表达式并发症,即使它很简单,请在读完整个字符串后使用strtok
。然后将其添加到阵列上。
while(1){
if(fscanf(fp, "%s", word) == EOF) break;
printf("%s\n",word);
const char s[2] = "-";
char *token;
token = strtok(word, s);
while( token != NULL )
{
printf("%s\n", token );
token = strtok(NULL, s);
}
}
给出输出
Alpha-Beta-Gamma-Delta-Epsilon
Alpha
Beta
Gamma
Delta
Epsilon
Zeta-Eta-Theta-Iota-Kappa-Lamda-Mi
Zeta
Eta
Theta
Iota
Kappa
Lamda
Mi
Ni-Ksi-Pi-Ro-Sigma
Ni
Ksi
Pi
Ro
Sigma
干杯!