使用fscanf从文件中读取单词

使用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

我有一个编码如下的.txt文件:

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]
不是正则表达式,如果您已经阅读了文档中的。