使用fscanf从文件中读取单词
我有一个编码如下的.txt文件:使用fscanf从文件中读取单词,c,C,我有一个编码如下的.txt文件: Alpha-Beta-Gamma-Delta-Epsilon Zeta-Eta-Theta-Iota-Kappa-Lamda-Mi Ni-Ksi-Pi-Ro-Sigma 我想读这些单词并将它们存储在数组中。 我用fscanf(fp,“%[^-]”,word) 但是当我把fscanf放在一段时间内时,它一直在读同一个单词。如果我把它放在while语句中,它不会重复 重点是从字母到西格玛分别阅读每个单词 我为您提供了一个关于该问题的最小可验证代码: #includ
Alpha-Beta-Gamma-Delta-Epsilon
Zeta-Eta-Theta-Iota-Kappa-Lamda-Mi
Ni-Ksi-Pi-Ro-Sigma
我想读这些单词并将它们存储在数组中。
我用fscanf(fp,“%[^-]”,word)
但是当我把fscanf
放在一段时间内时,它一直在读同一个单词。如果我把它放在while语句中,它不会重复
重点是从字母到西格玛分别阅读每个单词
我为您提供了一个关于该问题的最小可验证代码:
#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;
}
#包括
#包括
#包括
int main(){
文件*fp;
char*word=(char*)malloc(40);
整数计数=0;
char*字[30];//最多30个
fp=fopen(“MyWords.txt”,“r”);//只读
int r=1;
而(1){
如果(fscanf(fp,“%[^-]”,word)=EOF)中断;
printf(“%s”,单词);
}
fclose(fp);
返回0;
}
注意:我不想修改该文件。另外,我应该如何处理宽度说明符为39的
\n
字符限制输入,比单词可用的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.
}
while(fscanf(fp,“%39[^-\n]”,word)==1){
printf(“\n”,字);
fscanf(fp,“%*[-\n]”;//使用分隔符,无需保存。
}
注意:使用[^-\n]
而不是[^\n-]
,因为稍后放置-
看起来像是一个不完整的扫描集范围的开始。上述答案很好,如果您不希望代码中出现正则表达式复杂的情况,即使它很简单,请在读取整个字符串后使用strok
。然后将其添加到数组中
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
干杯 代码从不读取'-'
,因此扫描会被卡住<代码>'-'
仍保留在fp
站点中
?来自fscanf
的测试不应该是==1
吗?修复了这个问题,抱歉,请发布显示问题的实际测试,您编译、运行并验证了它。你似乎在猜测。if(fscanf(fp,“%[^-]”,word)=EOF)中断代码>-->如果fscanf()
返回0,代码应该怎么做?有没有办法知道fscanf
是否划界\n
?要知道电话何时接通changed@Theo.Fanis要知道行何时更改,代码可以使用char定界[2];fscanf(fp,“%1[-\n]”,定界)
和test划界[0]
,但是更好的代码应该使用fgets()
读取一行作为时间,然后解析该行中的“单词”。我看不到任何包含regex@FelixPalmen,我所说的regex是指凌乱的%39[^-\n]
部分,这显然令人困惑。您可以使用一个更简单的分隔符拆分字符串。%39[^-\n]
不是正则表达式,如果您已经阅读了文档中的。