您好我可能需要一些帮助来扫描文件。 每行包含8个数字长数字,但我只需扫描最后四个数字。
我的想法是扫描整个数字,而不是从第4位拷贝数到新数组。任何更聪明的想法?
答案 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:
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;
}
好的是,你得到了你需要的一切,指向头部,长度等等
不好的是,我读了整行,这可能是不必要的:)