如何从C中的第n个位置扫描数字

时间:2013-04-07 11:46:16

标签: c

您好我可能需要一些帮助来扫描文件。 每行包含8个数字长数字,但我只需扫描最后四个数字。

我的想法是扫描整个数字,而不是从第4位拷贝数到新数组。任何更聪明的想法?

5 个答案:

答案 0 :(得分:3)

一种简单的方法是在循环中读取一行fgets,然后运行如下:

sscanf(buf, "%*4d%4d", &a);

这将忽略前四位数字,并将最后四位数字复制为整数a

显然没有错误检查(只有每行8个数字才会起作用),但它快速而简单。您可以检查scanf的返回值是否为1,这将成功读取4位数字。

编辑(由@Grijesh Chauhan撰写)

示例代码:

int main(){
    FILE* fp = fopen("file","r");
    char buf[128];
    int a;
    while(!feof(fp)){             // while end of file comes
      fgets(buf, 127, fp);         //read complete line in a buffer 
      sscanf(buf, "%*4d%4d", &a);  //scanf from buffer, last 4 digits
      printf("%d\n",a);         
    }
    return EXIT_SUCCESS;
}

并执行:

$ gcc y.c -Wall -o y
$ ./y
5678
5432
8324
3223

表示文件:

$ cat file
12345678
98765432
45678324
98653223

答案 1 :(得分:1)

在C中使用以下技术对于读取下面显示的文件非常有用,这是你想要的吗?

虽然未达到EOF:

  • 首先在第一个缓冲区中读取4个字符,并且未使用
  • 使用fscanf()%d
  • 读取一行中的数字
  • 阅读\n
  • 打印号码

该文件如下:

$ cat file
12345678
98765432
45678324
98653223

代码是(读评论):

#include<stdio.h>
#include<stdlib.h>
int main(){
    FILE* fp = fopen("file","r");
    char first[5];
    int second;
    while(!feof(fp)){          //  While EOF loop runs   
     fgets(first, 5, fp);      //  read first 4 chars in a line
     fscanf(fp,"%d",&second);  //  Read next 4 digits in 
     fgetc(fp);                //  read \n
     printf("%d\n",second);
    }
    return EXIT_SUCCESS;
}

它的运行方式如下:

:~$ ./a.out 
5678
5432
8324
3223

答案 2 :(得分:0)

在每一行上,使用getc读取(并丢弃)四个字符,然后使用fscanf读取一个包含4位数的数字。

我会先简单地通过sed传递文件:

sed 's/^[0-9]{4}\([0-9]{4}\)$/\1/' <file | your_c_program.out

作为奖励,以这种方式使用sed验证每行确实有8位数字。

编辑:使用fseek代替getc确实是一个更好的主意

答案 3 :(得分:0)

该程序读取每行的最后四个数字(假设每行有8个)并将其放在变量nr中:

int main(void) {
char buff[8];
int nr;
FILE *theFile=fopen("/home/mppl/Desktop/file","r");

 while(fscanf(theFile,"%s\n",buff)!=EOF){
    nr= atoi(&buff[4]);
    printf("nr=%d\n",nr);

 }

}

这可能不是最安全或最有效的方法,但确实很简单。

答案 4 :(得分:0)

这是一个有趣的问题,我不是C专家。我只是离开我的解决方案 虽然我在下面的代码中使用“getline”功能,但我会投票给“sscanf”。 但是“sscanf”通常用于从字符串中取出特定元素(比如用斜线,反斜杠或点分隔的数字),@ Toesmash的问题是从特定位置读取,这与内容无关。你必须考虑这样一个简单的任务是否值得。
所以也许“getline”简单而且足够好。这是我的想法。

int main()
{
    FILE * fp;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;

    if ((fp = fopen("sample.txt", "r")) == NULL )
    {
        /* do your error process */
    }

    while((read = getline(&line, &len, fp)) != -1)
    {
        /* you see here offset is 5, if you want the last 4 characters */
        printf("%s", (line + (read - 5)));
    }

    return 0;
}
好的是,你得到了你需要的一切,指向头部,长度等等 不好的是,我读了整行,这可能是不必要的:)