我是C编程的新手,但有一点Java知识,所以我想编写一个程序来读取存储在文件中的字符串,可能是用逗号分隔的几个名字,例如"boy","girl","car"
等。在Java中我会使用像string str[]=str1.split(" ");
这样的东西。
所以我每次都想出了几个代码,但似乎都没有,这是我最近的代码:
fscanf(fp,"%[^\n]",c);
但这基本上打印整行,直到找到新行。我也尝试过使用
fscanf(fp,"%[^,]",c);
如果我使用gets()
它只获取第一个字符串并忽略第一个逗号中的所有其他字符串。
这没有给出任何合理的输出,而是给出了一些分钟(编码)字符。 请任何人都可以帮我解决如何选择以逗号和引号分隔的字符串值
答案 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"
...
*/