从文件行扫描到C中的整数

时间:2014-03-30 15:04:47

标签: c io string-parsing

我在扫描文件中的字符串时遇到问题,直到出现整数值。 如果我尝试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);之类的代码也不起作用。 我的目的是扫描所有内容,直到字符串中的整数值,然后分别扫描整数。 有任何想法吗 ?

谢谢你们。

4 个答案:

答案 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) {

*表示数字前面的非数字字符将被忽略。