您好,我可能需要一些有关从文件扫描的帮助。每行包含 8 个长数字,但我只需要扫描最后四个。
我的想法是扫描整个数字,而不是从第 4 位复制数字到新数组。有什么更聪明的想法吗?
一个简单的方法是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
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
在每一行上,用 读取(并丢弃)四个字符getc
,然后用fscanf
读取一个 4 位数字。
我会先简单地传递文件sed
:
sed 's/^[0-9]{4}\([0-9]{4}\)$/\1/' <file | your_c_program.out
作为奖励,sed
以这种方式使用可以验证每行确实有 8 位数字。
编辑:使用fseek
而不是getc
确实是一个更好的主意
该程序读取每行的最后四个数字(假设每行有 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);
}
}
这可能不是最安全或最有效的方法,但确实很简单。
这是一个有趣的问题,我不是 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;
}
好消息是,你得到了你需要的一切,指向头部的指针、长度等
。坏的是,我读了整行,这可能是不必要的 :)