我有一个table.txt文件:
class #1
Sect1: cat
Sect2: dog
Sect3: mouse
Sect4: bird
Sect5: squirrel
class#2
Sect1: shark
Sect2: octopus
Sect3: tuna
Sect4: eel
Sect5: dolphin
我可以读取文本文件并将其内容放入缓冲区。我提示用户输入动物,程序将搜索表格并输出动物在表格中的位置。示例如下:
Enter animal to search for: mouse
The animal mouse is located at Class #1 in Sect#3
我试图找到最好的方法来做搜索,但我不确定。谢谢大家的帮助。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE* infile;
char* buffer;
long numbytes;
char animal[10];
char class[10];
char sect[10];
infile = fopen("table.txt", "r");
if (NULL == infile) {
printf("file can't be opened \n");
}
/* Get the number of bytes */
fseek(infile, 0L, SEEK_END);
numbytes = ftell(infile);
/* reset the file position indicator to
the beginning of the file */
fseek(infile, 0L, SEEK_SET);
/* grab sufficient memory for the
buffer to hold the text */
buffer = (char*)calloc(numbytes, sizeof(char));
/* memory error */
if (buffer == NULL)
return 1;
/* copy all the text into the buffer */
fread(buffer, sizeof(char), numbytes, infile);
fclose(infile);
printf("Enter animal to search: ");
scanf("%s", animal);
//to do animal search
printf("\nThe aninmal %s is located in %s and %s", animal, class, sect);
/* free the memory we used for the buffer */
free(buffer);
// Closing the file
fclose(infile);
return 0;
}
我试着将每一行扫描到一个数组中,或者使用一个结构体来组织它,但是我不完全确定哪种方法是最好的。我是正确地构造了缓冲区来进行搜索,还是需要在之后解析它?
2条答案
按热度按时间mrzz3bfm1#
只需在缓冲区中 * 向后 * 搜索即可找到动物:
你可以努力 * 解析 * 文件,把东西分解成指针和以空结尾的字符串的层次结构......程序会不会"活"得不仅仅是一次搜索?
(Of当然,如果缓冲区为 * null terminated *,则可以使用
strstr()
来查找动物,然后反向搜索局部"section"和"class"。有很多方法可以做到这一点!)事实上,在缓冲区的末尾分配一个额外的字节是有利的,不管:
注意
buffer
在第一次使用时就被声明和定义了,你也可以对其他变量这样做。1.如果
fopen()
失败,则不要继续执行。2.不要在同一个FILE指针上调用
fclose()
两次。3.不要从
calloc()
强制转换返回指针。4.
scanf("%s", animal);
==〉scanf("%9s", animal);
5.为什么要节省内存?10个字节的字符串是微不足道的!
将所有加载缓冲区的代码封装到一个函数中。传递文件名并接收回一个指向(以空结尾的)缓冲区的指针(必须是
free()
'd。这不仅"整理"了main()
,而且您可能能够在其他项目中使用相同的"文件加载"代码。i7uq4tfw2#
在回顾你的项目所要做的事情时,我对你的代码做了一些重构,并引入了一个你可能熟悉也可能不熟悉的新项目,那就是一个结构。每个动物的特征(名称、类、节)似乎都适合结构数组的用法,这样你就可以读取和存储你所拥有的动物。有了这些,下面是你代码的重构版本。
以下是其中的一些亮点。
以下是使用您的数据文件在终端上输出的示例。
如果结构对你来说是一个新概念,你可能想尝试一种不同的方法,或者现在可能是研究结构用法的时候了。无论如何,试试看它是否符合你的项目精神。