1

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

我的想法是扫描整个数字,而不是从第 4 位复制数字到新数组。有什么更聪明的想法吗?

4

5 回答 5

3

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

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

这将忽略前四位数字,并将后四位数字复制到 integera中。

那里显然没有错误检查(它只有在每行有 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
于 2013-04-07T12:21:17.430 回答
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
于 2013-04-07T12:18:02.150 回答
0

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

我会先简单地传递文件sed

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

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

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

于 2013-04-07T11:52:21.170 回答
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);

 }

}

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

于 2013-04-07T12:00:43.960 回答
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;
}

好消息是,你得到了你需要的一切,指向头部的指针、长度等
。坏的是,我读了整行,这可能是不必要的 :)

于 2013-04-07T12:26:15.870 回答