如何只将文本文件中的单词读入特定行的单词?

时间:2017-10-14 18:43:53

标签: c arrays file

我有一个如下文字文件。我使用fscanf进行阅读,直至看到"找到",然后将在该行中的所有内容读入数组。这个文本文件只是一个例子,所以我不能硬编码:

text text some words text 
text hello text text
text text random text
world

found read1 read2 read3
don't
read any of this

到目前为止,我有以下代码:

    char **arr = NULL;
    int i = 0;
    char var[3000];

    FILE *fp = fopen("file.txt", "r");

    while(fscanf(fp, "%s", var) != EOF){
        if(strcmp(arr[i], "found")==0){
            while(fscanf(fp, "%s", var)!=EOF){
                if(strcmp(var, "\n")==0){
                    break;
                }
                arr = realloc(arr, (i + 1)*sizeof(*arr));
                arr[i] = malloc(strlen(var)+1);
                strcpy(arr[i++], var);
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

如果文字看起来与您描述的完全一致,那么您可以尝试:

char *array[100];
i = 0;

while(fscanf(file, "%s", var) != EOF){
    if(strcmp(var, "found") == 0){
        while(fscanf(file, "%s", var) != EOF){
            if( strcmp(var, "\n") == 0 ) break;
            array[i] = (char*)malloc(sizeof(var)*sizeof(char));
            strcpy(array[i],var);
            i++;
        }
    }
} 

修改

由于scanf忽略空格,因此上述代码无法在换行符处停止。要修复它,您可以使用fgets()

while(fgets(var, 3000, stdin) != NULL){
    char *checker = strstr(var, "found");
    if(checker == var){
        size_t ln = strlen(var), start = 0;
        for(int j = 0; j< ln; j++)
            if(var[j] == ' ' || var[j] == '\n'){  
                array[i] = (char*)malloc(sizeof(var)*sizeof(char));
                strncpy(array[i++], var + start, j - start);
                start = j;
                while(var[j++] == ' ') start ++;
            }  
    }
}

以上代码经过测试可以正常工作,只需注意它也会在array[0]中保留“找到”字样。同时使用stdin对其进行了测试,但在使用stdin中的文件替换fgets(var, 3000, stdin)时不会有任何问题。