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

3

我刚接触C编程,但了解一些Java知识。我想写一个程序,从文件中读取字符串,可能包含多个用逗号分隔的名称,例如"boy","girl","car"等。在Java中,我会使用类似于string str[]=str1.split(" ");的东西。

所以我尝试了几个代码,但似乎都没起作用,这是我最近的一份代码:

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

但是这个方法会打印整行直到找到一个新的换行符。我也尝试过使用
fscanf(fp,"%[^,]",c);

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

这没有给出任何合理的输出,而是给出了一些微小的(编码)字符。 请问有人能帮我提取由逗号和引号分隔的字符串值吗?


如何在C语言中从文件中读取逗号分隔的带引号字符串 - 绝对不要使用scanf() - user529758
你可以使用反引号或者选中代码后按下ctrl+k,或者点击顶部附近并选择代码来标记代码。 - wazy
3
strchr()strtok_r()都是可以使用的函数。strchr()函数在一个字符串中搜索给定字符的第一次出现,返回该字符后面的子串。strtok_r()函数用于将一个字符串分解成一系列子字符串,使用给定的分隔符。 注意:这两个函数的具体功能和使用方法请参考提供的链接。 - user529758
相反地,如果输入格式良好,则scanf是解决方案。调用是为了读取格式化的输入。 - cgledezma
@cgledezma 但对于一个完全的初学者来说,要做到正确并不容易。 - user529758
显示剩余2条评论
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的manpage。 希望这能帮到你 :)


感谢所有给予帮助的人。非常感谢。最终我想出了这个方法,现在运行良好。 - Adegbite Philips Mayokun

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

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"
...
*/

#include #include int main(void) { FILE *fp; char hello[50]; char *p = hello; char *tokens[50]; int i = 0; fp=fopen("file.txt","r"); fscanf(fp,"%[^\n]",hello); while (i < 50) { tokens[i] = strtok_r(p, " ,", &p); if (tokens[i] == NULL) { break; } i++; } i = 0; while (i < 5) { printf("%s\n", tokens[i++]); } return 0; } - Adegbite Philips Mayokun
@AdegbitePhilipsMayokun 你想对我说什么? - BLUEPIXY
请问我应该如何编写代码以正常显示?我有这段代码,它应该使用C语言的归并排序算法对字符串数组进行排序,但似乎无法正常工作。 - Adegbite Philips Mayokun
@AdegbitePhilipsMayokun 您的评论代码似乎与我的答案不相关。如果您另有问题,那该怎么办? - BLUEPIXY
我已经进一步进行了,但是我在将字符串数组传递到另一个函数时遇到了困难,它就是不起作用。尽可能地,我已经尝试粘贴代码,但它就是不接受。 - Adegbite Philips Mayokun
显示剩余3条评论

0

fscanf不支持正则表达式,而是使用占位符。因此,您需要指定要读取的占位符,然后fscanf将获取与您的模式匹配的下一个元素。要获取所需内容,可以使用以下类似代码:

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

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


至少在某些实现(>=C99?)中,fscanf可以处理这种类型的表达式(http://www.cplusplus.com/reference/cstdio/scanf/?kw=scanf)。 - urzeit
@urzeit 我想你是对的,但解决读取格式化输入的方法并不是读取整行然后解析它。更简单的方法是只需使用 fscanf() 并提供正确的格式即可。 - cgledezma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接