我在扫描文件中的字符串时遇到问题,直到出现整数值。
如果我尝试fgets(str,30,file);
,它会扫描一行文件中的所有内容,包括整数。
档案示例:
Audi 2014
Wall Street 1995
The number of words used in one line may vary 9999
整数始终是最后一个,但值之前的单词数量并不总是相同,因此fscanf(file,"%s %s %d", str1, str2, &integer);
之类的代码也不起作用。
我的目的是扫描所有内容,直到字符串中的整数值,然后分别扫描整数。
有任何想法吗 ?
谢谢你们。
答案 0 :(得分:2)
使用fgets读取并通过字符串while(!isdigit[str[i++]);
进行单次传递以到达数字的起始位置。然后atoi
从该位置开始,并在其中放置'\0'
fgets(str,30,file);
int i = 0;
while(str[i]!='\0' && !isdigit(str[i]))
i++;
int num = atoi(str + i);
str[i] = '\0';
现在,该号码位于num
,其前面的字符串位于str
答案 1 :(得分:2)
这是骨头C,没有花哨的东西。如果您的数据具有您描述的格式,即文本文件中的空格分隔单词,换行符前面的每一行的数字,并且每行至少以一个不是您的数字的单词开头,它将起作用。缓冲区的大小可以随意改变,它只会影响性能。 此外,您的文件需要至少有一行您所描述的格式。
FILE *f;
char bf[2048];
char *p, *p1;
int line, i, num;
f = fopen("mydatafile.txt", "r");
if (f)
{
line = 0;
while (!feof(f))
{
fgets(bf, sizeof(bf), f);
p1 = bf;
p = strchr(bf, '\n');
while(p)
{
*p = 0;
i = 0;
while (isdigit(p[--i])) ;
num = atoi(p+i+1);
p[i] = 0;
printf("line %d: %s number = %d\n",++line, p1, num);
p1 = p+1;
p = strchr(p1, '\n');
}
}
fclose(f);
}
对于您的样本数据,输出为:
line 1: Audi number = 2014
line 2: Wall Street number = 1995
line 3: The number of words used in one line may vary number = 9999
答案 2 :(得分:1)
阅读整行并进行自己的解析,或使用fscanf。模式“%29 [^ 0-9]%d”或类似的东西。
答案 3 :(得分:1)
如果您只需要输入行中的这些数字,则可以使用以下代码来实现目标
while (scanf("%*[^0-9]%d", &num) == 1) {
*
表示数字前面的非数字字符将被忽略。