从文件中读取以逗号分隔的“引用”字符串

时间:2013-06-19 06:31:13

标签: c csv

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

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

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

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

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

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

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

4 个答案:

答案 0 :(得分: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的联机帮助页。 希望这可以帮到你:)

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

“男孩”, “女”, “汽车”,

请注意,文件字符串应以','

结尾
  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;
}

答案 3 :(得分: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"
...
*/