使用fscanf从文件中读取单词

时间:2017-06-07 17:25:33

标签: c

我有一个文件.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字符

2 个答案:

答案 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

干杯!