3

我是 C 编程新手,但有一点 Java 知识,所以我想编写一个程序来读取存储在文件中的字符串,可能是几个用逗号分隔的名称,例如"boy","girl","car"等。在 Java 中,我会使用类似string str[]=str1.split(" ");.

所以我每次都想出几个代码,但似乎都没有,这是我最近的代码:

fscanf(fp,"%[^\n]",c);

但这基本上会打印整行,直到找到新行。我也尝试过使用

fscanf(fp,"%[^,]",c);

如果我使用gets()它,它只会获取第一个字符串并忽略第一个逗号中的所有其他字符串。

这没有给出任何合理的输出,而是给出了一些分钟(编码)字符。请任何人都可以帮助我如何挑选用逗号和引号分隔的字符串值

4

4 回答 4

1

您可以使用 strtok() 函数 (string.h) 来执行此任务。将文件数据存储在相当大的字符串中。并申请

str = strtok(full_file_string,",");
/* you can save this string in a 2 dimensional array of characters or print it */
while(NULL != str)
{
    str=strtok(NULL,",");
    /*print or save your next word here as you like */
}

如需进一步参考,请参阅 strtok 的联机帮助页。希望这可以帮助你:)

于 2013-06-19T08:44:24.260 回答
0

fscanf 不适用于正则表达式,而是用于占位符。因此,您需要为要读取的内容指定占位符,然后 fscanf 将获取与您的模式匹配的下一个元素。为了得到你想要的东西,可以使用类似的东西:

char word[enough_space];
.
.
.
while(fscanf(fp, "\"%s\"", word) != EOF)
{
  //Do something with yout word.
};

在这里,您将尝试获取引号之间的字符串。请注意占位符如何指示应保存匹配的哪一部分。在连续调用 fscanf 将进入下一场比赛,依此类推。当它消耗整个文件时,它将返回 EOF。

于 2013-06-19T06:38:53.057 回答
0

下面的示例将提取子字符串。你的填充的格式应该是这样的:

“男孩”、“女孩”、“汽车”、

请注意,文件字符串应以“,”结尾

  int read_file_with_string_tokens() {

        char * tocken;
        char astring[127];
        int current = 0;
        int limit;


    char *filebuffer = NULL;
    FILE *file = fopen("your/file/path/and/name", "r");
    if (file != NULL) {

        fseek(file, 0L, SEEK_END);
        int f_size = ftell(file);
        fseek(file, 0L, SEEK_SET);

        filebuffer = (char*) malloc(f_size + 2);
        if (filebuffer == NULL) {
            pclose(file);
            free(filebuffer);
            return -1;
        }
        memset(filebuffer, 0, f_size + 2);
        if (fgets(filebuffer, f_size + 1, file) == NULL) {
            fclose(file);
            free(filebuffer);
            return -1;
        }

        fclose(file);


        memset(astring, 0, 127);


        char *result = NULL;

        tocken = strchr(filebuffer, ',');
        while (tocken != NULL) {
            limit = tocken - filebuffer + 1;
            strncpy(astring, &filebuffer[current], limit - current - 1);

            printf("%s" , astring);
            current = limit;
            tocken = strchr(&filebuffer[limit], ',');
            memset(astring, 0, 127);
        }

        free(filebuffer);
    } 

    return 0;
}
于 2013-06-19T07:16:22.307 回答
0
#include <stdio.h>

int main(void){
    char line[128];
    char word[32];
    FILE *in, *out;
    int line_length;

    in  = fopen("in.txt", "r");
    out = fopen("out.txt", "w");

    while(1==fscanf(in, "%[^\n]%n\n", line, &line_length)){//read one line
        int pos, len;
        for(pos=0;pos < line_length-1 && 1==sscanf(line + pos, "%[^,]%*[,]%n", word, &len);pos+=len){
            fprintf(out, "%s\n", word);
        }
    }
    fclose(out);
    fclose(in);
    return 0;
}
/* output result out.txt
"boy"
"girl"
"car"
...
*/
于 2013-06-19T09:06:30.150 回答