222wan

导航

c语言中的文件与结构体

c语言中文件读取的操作:

在这里展示一种写法:

这里我们要打开的文件地址分两种:
相对地址:必须要在这个C语言文件同级目录下的txt文件或者其他(注意:必须是同级目录下)

绝对地址:这里我们用的就是绝对地址,绝对地址我个人觉得更好一些,因为不用费劲找同级目录比较方便

其他注意:在我们的路径中最好不要出现中文字符否则报错的几率很大

      其次绝对路径的写法大家要熟记。

ifstream ifs;

    ifs.open("D:\\test01.txt");
    if(!ifs.is_open()){
        printf("文件打开失败");
    }
    
    //读取数据
    char buf[1024]={0};
    while(ifs>>buf)
    {
        cout<<buf<<endl;
    }
    ifs.close();

 除了以上的一种文件读取操作下面是另一种文件读取操作并且可以讲过读取到的文件中的内容存入结构体中

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct trainFile
{
    char trainid[20];        //列车号     
    char firststand[20];    //始发站 
    char middlestand[20];    //经停站             
        //总位置 
    int freezw;                //剩余位置 
};
void test()
{ struct trainFile train[15];//创建train结构体 
    FILE *fp = fopen("D:\\test01.txt", "r");// 打开文件并且让fp指向文件 
    if (fp == NULL) {
        fprintf(stderr, "文件打开失败.\n");
        exit(0);
    }
    char row[80];
    char *token;
    int i=0;
    if(true){
            while (fgets(row, 80, fp) != NULL) {
              sscanf(row,"%s %s %s %d",train[i].trainid,train[i].firststand,train[i].middlestand,&train[i].freezw);//把数据存入结构体数组 
              printf("%s\t%s\t%s\t%d\n",train[i].trainid,train[i].firststand,train[i].middlestand,train[i].freezw);
            i++;
        }
    }
    fclose(fp);

}
int main()
{
    test();
   system("pause");
    return 0;
    
 
    
}
 

在这段代码中额外要注意的是在while语句上方的if条件中的条件,这里原来的写法是if(fgets(row,80,fp)!=NULL)后来我发现这里出错了(文件中有三条数据但只打印出来后两条),原因是条件中的这一大串式子,他是一个游标并且是一次性的,一但用过就往下指,

学过javaweb的同学应该能明白,在我们的链接MySQL数据库操作中,从数据库获取的内容游标r.next()和这个很类似,用过就会继续下行,所以大家在这一块注意一下。

在我们的主函数中出现的system(“pause”)这个是用来暂停窗口的,应为有时候我们的运行窗口一闪就会消失用这个来暂停窗口,

注意:他必须在主函数的return前添加

除此之外,我们的代码没有任何错误之后可能会出现中文读取乱码这里我们将我们的文本文件的字符集修改为ASCLL码这样在读取操作中就不会出错

 

最后教大家一个判断错误的小方法:
当我们的输出结果有很多重复的一样的字(输出结果不对)时大概概率是我们代码出问题了,尤其是输入输出那块有问题

当我们输出结果全是繁体字不认得这里大概率是字符集的问题也就是我们常说的中文乱码

 

以上就是文件操作中比较易错的点希望大家在遇到问题的时候能够在这里找到解决方案

posted on 2023-06-23 16:19  角落的蘑菇  阅读(37)  评论(0编辑  收藏  举报