文件 基础问题,求解答~

一个文本文件里存有多种花草树木的英文名称,一个一行,编写程序完成:
1、编写函数读取该文件内容
2、编写函数按英文字典顺序排序
3、编写查找函数,输入一种花木的英文名称,查找是否存在该表中。
这个问题的第一问我以解决,但是第二、第三问我不知道改怎么去写,怎么去对比文件内容,怎么去更改文件的内容呢?我们还没讲文件,这是预习的问题

img

写了一个例子,代码及测试结果如下:
数据文件(data.txt,名字随便写的):

rose
abc
test
haha
nono

运行结果:

img

代码:

#include <stdio.h>
#include <string.h>
//定义花草树木的最多种类
#define MAXNMB 200
//读取文件,a返回所有花草树木的英文名称,长度限定为40,n返回读取的花草树木的个数
int readFile(const char* filename, char a[][40], int* n)
{
    int i = 0;
    int len = 0;
    FILE* fp = fopen(filename, "r");
    if (fp == 0)
    {
        printf("文件打开失败!\n");
        return 0;
    }
    while (!feof(fp))
    {
        fgets(a[i], 40, fp); //逐行读取文件
        len = strlen(a[i]);

        if (len > 0)
        {
            if (a[i][len - 1] == '\n') //删除最后的回车符
                a[i][len - 1] = 0;
            i++;
        }
            

    }
    *n = i;
    fclose(fp);
    return 1;

}
//排序
void sort(char a[][40], int n)
{
    int i, j;
    char tmp[40];
    for (i = 0; i < n - 1; i++)
    {
        for (j = 0; j < n - 1 - i; j++)
        {
            if (strcmp(a[j], a[j + 1]) > 0)
            {
                strcpy(tmp, a[j]);
                strcpy(a[j], a[j + 1]);
                strcpy(a[j + 1], tmp);
            }
        }
    }
}

//查找
void find(char a[][40], int n, char* name)
{
    int i = 0;
    for (; i < n; i++)
    {
        if (strcmp(a[i], name) == 0)
        {
            printf("%s在列表中\n",name);
            return;
        }
    }
    printf("%s不在列表中\n", name);
}

//显示数据
void show(char a[][40], int n)
{
    for (int i = 0; i < n; i++)
    {
        printf("%s\n", a[i]);
    }
}


int main()
{
    char a[MAXNMB][40];
    int n = 0;
    char name[40] = { 0 };
    if (readFile("data.txt", a, &n))
    {
        printf("读取的文件内容:\n");
        show(a, n);
        sort(a, n); //排序
        printf("排序后的内容:\n");
        show(a, n);
        printf("输入需要查找的花草树木名称:");
        scanf("%s", name);
        find(a, n, name);
    }
    return 0;
}

先找字符串对应的函数。
在 C 语言 中我们需要比较两个 字符串 ,可以使用 strcmp 函数,使用 strcmp 函数比较字符串时,不是比较字符串的长度,而是挨个比较字符串中的 字符 大小。
这个比较的顺序就是英文词典的顺序。
另外,你现在程序需要把读出的字符按行合并成一个字符串。

1.定义一个字符串数组(数组中的每一个元素都是字符串)或者结构体(结构体只有一个成员,char str[5],然后结构体变量定义成数组)
个人觉得二维数组比较难理解,结构体用在这里虽然有点大材小用,但是我起码会用……

2.用fscanf函数读取文件中每一个花的名称,存储到数组中

3.在定义一个类似的数组,逐一用strcmp函数比较每两个英文单词,记第一个不相同的字母为*,根据返回值与0的大小关系(用if条件),判断哪个在前哪个在后。有点数字大小排序那种感觉了,方法可以参考,就稍微有点麻烦,第一个字母同就比较第二个字母,依次类推。再就是考虑怎么换序,数组中的数字交换位置,用temp 用等于号赋值,两个字符串交换顺序,用strcpy函数(拷贝)。新认识的函数都去搜一下头文件和用法,尝试着去用和解决报错。

4.有了第二问的基础,第三问就容易一点了。既然每一个花的名称都存储在数组中了,只要遍历这个数组,用strcmp函数比较,判断返回值是不是0即可。

5.需要注意的是,要记录花名称的的数量吗?如果记录,文件读取完了返回n,如果不记录,可以数组设大点,判断第i个元素的[0]是不是等于'\0'即可

最近写过游戏排行榜,也是从文件中读取玩家名分数还有记录每一个玩家的历史最高分还有排序啥的,以上是我的思路,有的方法来源于网络。祝你成功!