精华内容
下载资源
问答
  • 0x00 问题 C代码如下: #include <stdio.h> #include <stdlib.h> void main(void) { FILE *fp = NULL; fp = fopen("test.txt","r"); if(fp==NULL) { printf(...

    0x00 问题

    C代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    void main(void)
    {
            FILE *fp = NULL;
            fp = fopen("test.txt","r");
            if(fp==NULL)
            {
                    printf("文件不存在\n");
                    exit;
            }
            char str[30]={'\0'};
        
            while(!feof(fp))
            {
                    fscanf(fp,"%s",str);
                    printf("%s\n",str);
            }
            fclose(fp);
    }
    

    文本文件中的内容如下:

    a
    b
    c
    

    程序的读取结果如下,最后一行出现重复读取问题:

    a
    b
    c
    c
    

    0x01 问题解决办法

    需要遵循先读取再判断文件是否结束的原则。
    在C语言中,feof()函数的使用是根据指针内容判断的,而非指针位置,无论指针是否到头,甚至超出了,它都需要先读取指针的内容,看一看内容是否是EOF,然后才知道文件是否到头。上述代码中第四次循环遇到EOF时不能读入有效字符,就会重复输出最后一个字符。
    故将代码修改为如下形式:

    #include <stdio.h>
    #include <stdlib.h>
    
    void main(void)
    {
    	FILE *fp = NULL;
    	fp = fopen("test.txt","r");
    	if(fp==NULL)
    	{
    		printf("文件不存在\n");
    		exit;
    	}
    	char str[30]={'\0'};
    	
    	fscanf(fp,"%s",str);
    	while(!feof(fp))
    	{
    		printf("%s\n",str);
    		fscanf(fp,"%s",str);
    	}
    	fclose(fp);
    }
    
    展开全文
  • C语言行读取文本文件

    千次阅读 2020-09-09 22:14:17
    通常,通过在文本文件最后一行后放置文件结束标志来指明文件的结束。 文本文件具有可读性,一般我们用的txt文件,log文件都是文本文件,其由字符构成,故我们就按字符处理,按行读取(linux下由’\n’字符换行,...

    C语言按行读取文本文件


    一般来说,计算机文件可以分为两类:文本文件和二进制文件

    文本文件是一种由若干行字符构成的计算机文件。文本文件存在于计算机文件系统中。通常,通过在文本文件最后一行后放置文件结束标志来指明文件的结束。

    文本文件具有可读性,一般我们用的txt文件,log文件都是文本文件,其由字符构成,故我们就按字符处理,按行读取(linux下由’\n’字符换行,wondows下由’\r’’\n’组合一起换行)。

    C标准库函数
    函数声明

    FILE *fopen(const char *path, const char *mode);
    char *fgets(char *s, int size, FILE *stream);
    int feof(FILE *stream);
    int fclose(FILE *stream);
    

    fopen(): 使用给定的模式 mode 打开 path 所指向的文件,成功返回FILE指针。
    fgets(): 从指定的流 stream 读取一行,并把它存储在 s 所指向的字符串内。当读取 (size-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止。读到文件末尾或者出错时,返回NULL。
    feof():测试给定流 stream 的文件结束标识符。到达文件尾时返回EOF
    fclose():关闭流 stream。刷新所有的缓冲区。

    使用fopen打开文件,使用fgets循环读取每行文件,使用feof判断是否读完文件,使用fclose关闭文件。

    下面提供一个示例,仅供参考:
    实现了读取输出除空行外的每一行数据,返回文本的总行数

    #include <stdio.h>
    #include <string.h>
    
    // 每行最大长度
    #define LINE_MAX 1024
    
    /**
     *@para   path 输入文件路径
     *@return 文件行数
     */
    int read_line(char *path)
    {
    	FILE *fp;
    	int line_num = 0; // 文件行数
    	int line_len = 0; // 文件每行的长度
    	char buf[LINE_MAX] = {0}; // 行数据缓存
    
    	fp = fopen(path, "r");
    	if (NULL == fp) {
    		printf("open %s failed.\n", path);
    		return -1;
    	}
    
    	while(fgets(buf, LINE_MAX, fp)) {
    		line_num++;
    		line_len = strlen(buf);
    		// 排除换行符
    		if ('\n' == buf[line_len - 1]) {
    			buf[line_len - 1] = '\0';
    			line_len--;
    			if (0 == line_len) {
    				//空行
    				continue;
    			}
    		}
    		// windos文本排除回车符
    		if ('\r' == buf[line_len - 1]) {
    			buf[line_len - 1] = '\0';
    			line_len--;
    			if (0 == line_len) {
    				//空行
    				continue;
    			}
    		}
    		printf("%s\n", buf);
    		/** 对每行数据(buf)进行处理 **/
    	}
    
    	if (0 == feof) {
    		// 未读到文件末尾
    		printf("fgets error\n");	
    		return -1;
    	}
    	fclose(fp);
    
    	return line_num;
    }
    
    int main(int argc, char *argv[])
    {
    	int line_num = read_line(argv[1]);
    	printf("line_num = %d\n", line_num);
    	return 0;
    }
    

    测试:
    ubuntu1604,linux环境下运行

    mao@ubuntu:~$ cat a.txt
    aaaa
    bbbb
    cccc
    mao@ubuntu:~$ cat b.txt
    1234
    
    34153
    1111122
    3
    mao@ubuntu:~$ ./a.out a.txt 
    aaaa
    bbbb
    cccc
    line_num = 3
    mao@ubuntu:~$ ./a.out b.txt 
    1234
    34153
    1111122
    3
    line_num = 5
    mao@ubuntu:~$ 
    
    展开全文
  • 这几天忙于做课程设计 在初步完成后,出现了文件末尾重复读取的问题 操作系统使用的是ubuntu 16.04 linux下不支持fflush函数 首先采用小程序测试 写入文件: #include #include int main() { FILE *fp=...

    这几天忙于做课程设计 在初步完成后,出现了文件末尾重复读取的问题

    操作系统使用的是ubuntu 16.04     linux下不支持fflush函数

    首先采用小程序测试

    写入文件:

    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
    		FILE *fp=fopen("haha.txt","w");
    		fprintf(fp,"%s %d %s\n","haha",5,"lala");
    		fprintf(fp,"%s %d %s\n","hehe",5,"lele");
    		fprintf(fp,"%s %d %s\n","hihi",5,"lili");
    		fprintf(fp,"%s %d %s\n","huhu",5,"lulu");
    		fclose(fp);
    		return 0;
    }
    读文件

    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
    		FILE *fp=fopen("haha.txt","r");
    		char t[100],temp[100];
    		int n;
    		while(!feof(fp))
    		{
    				fscanf(fp,"%s %d %s",t,&n,temp);
    				printf("%s %d %s\n",t,n,temp);
    		}
    		fclose(fp);
    		return 0;
    }

    而产生的文件如下:

    haha 5 lala
    hehe 5 lele
    hihi 5 lili
    huhu 5 lulu


    读文件运行结果:


    最后一行信息重复  而在我的课程设计中 显示的则为多出一行    但是不是重复  而是有一行显示0

    根据网上所查资料,问题应该是当我选择feof判断文件是否结束时  文件最后的回车符也被读入

    但是具体为何出现这两种情况  目前还未明白

    解决方法为  改用fscanf的返回值来判断文件读入是否结束

    即 fscanf()!=x


    展开全文
  • 实现从文本中读取出指定学号的学生信息并显示,文本文件存放格式是每一行对应一个学生信息,最后一行没有换行符。 输入 solve(char s[])已经给一个字符串s,代表学生学号。 文件a.txt存放所有学生信息。 输出 输出该...

    Don’t look forward to tomorrow, don’t miss yesterday, to grasp today。不憧憬明天,不留念昨日,只把握今日。

    题目描述:

    实现从文本中读取出指定学号的学生信息并显示,文本文件存放格式是每一行对应一个学生信息,最后一行没有换行符。

    输入
    solve(char s[])已经给一个字符串s,代表学生学号。
    文件a.txt存放所有学生信息。

    输出
    输出该学号学生信息 如果不存在则输出Not Found!
    样例输入:
    11405200102
    如a.txt中内容为:
    11405200101 zhangsan 70 80 90 240 8011405200102 lisi 80 60 70 210 70
    样例输出:
    11405200102 lisi 80 60 70 210 70

    源代码如下:

    #include<stdio.h>
    #include<string.h>
    extern void solve();
    int main(void)
    {
        FILE *f=fopen("a.txt","w");
        fprintf(f, "%s\n", "11405200101 zhangsan 70 80 90 2140 80");
        fprintf(f, "%s\n", "11405200102 lisi 80 60 70 210 70");
        fprintf(f, "%s\n", "11405200103 lisasdsi 80 10 70 220 70");
        fprintf(f, "%s\n", "11405200104 liassi 80 60 70 240 70");
        fprintf(f, "%s\n", "11405200105 lzissssi 80 30 76 210 70");
        fprintf(f, "%s\n", "11405200106 lisgsi 80 50 70 210 70");
        fprintf(f, "%s\n", "11405200107 lizssi 80 67 70 280 76");
        fprintf(f, "%s\n", "11405200108 lisqsi 80 60 70 210 70");
        fprintf(f, "%s", "11405200109 lisdssi 80 67 70 210 70");
        fclose(f);
        char s[100];
        scanf("%s",&s);
        solve(s);
        return 0;
    }
    
    void solve(char s[]) {
        FILE *fq = fopen("a.txt", "r");
        int n;
        char line[20], a[100];
        for (n = 0; n < 9; n++) {
            fgets(line, 12, fq);
            fgets(a, 100, fq);
            if (strcmp(s, line) == 0) {
                printf("%s %s", line, a);
                fclose(fq);
                break;
            }
            if (n == 8) {
                printf("Not Found!");
            }
        }
    }
    

    运行结果如下:
    在这里插入图片描述
    最后的话:刷题要找自己的不足,然后去专攻。

    展开全文
  • 一行是说明性文字:本文件最后一次打开和运行日期是20190330。 第二行开始每行是一个可执行程序的名称(含路径)。编写一个应用程序能打开该文件,并顺序执行其中的每个程序,并更新文件第一行中的日期。 实现 ...
  • 原来的txt文件里面是10个0(每个0一行),然后第一次游戏结束后,排行榜是第一名是这次的分数,其他全是0。 然后在进行下一次游戏,结束后是排行榜第一的是这次游戏的分数,其他的全是0,第一游戏的分数不见了。 ```...
  • gets函数读取一行输入直到遇到换行符或者文件结尾,如果在终端运行,需要ctrl+z来模拟文件结尾,如果是从一个txt文件读取输入,就不需要ctrl+z,是不是在这个txt文件里面最后有个隐藏的东西来表示文件结尾?
  • 如图,为了将txt文件字符串包含的数字提取出来,编写了个程序。 思路: 找到is,然后指针后移三位,然后到达空格,则停止。再将字符转换为数字。 具体操作: 首先用fget()读取,然后用strstr()找到is,...
  • 这是我想读取文件<img alt="" height="341" src="https://img-ask.csdnimg.cn/upload/1614745845239.png" width="688" /></p> 这是最后结果...
  • 文本文件“ex804.txt”应与源文件“ex804.c”保存在同个文件夹中。 <p>(2)学生结构体定义如下: <p>struct stu{<!-- --> <p>int id; //学号 <p>char name[20]; //姓名 <p>int age; //...
  • 操作系统:Fedora 要求:请编写个程序,实现 tail -n a.txt 的功能:读取文件 a.txt 最后 n 并将其显示出来
  • C语言中fgets和fscanf区别详解 一、作用上的大概区别:...a.txt中的内容(第一行中“我爱你小白”和“开玩笑”中间有个空格,每行的最后都有回车): 我爱你小白 开玩笑 哈哈 开玩笑 1、使用fgets读取a.txt文件并写入
  • C语言自学月,搞出了读取文件数据,进行平均数和标准偏差计算,再输出的程序。...最后输出结果为两个TXT文件,各表示平均数和标准偏差。 有试过二维数组之类的,但失败太多了,为此浪费太多时间了,求大神帮忙。
  • C语言中关于feof的使用问题

    千次阅读 2019-08-20 11:45:30
    当你想读取文本文件的全部内容时,却发现容易出现奇怪的现象或者最后一行重复读取?细心看完这篇你就知道为什么了。 1.先来看一个简单的例子: 文本文件"test.txt"内容如下: 123 只有’123’三个字符。现在我们用一...
  • 设输入的英文短文不超过一行(假设正文最后有“.”结束,以“,”或空格分隔,不出现其他符号),编程将所有单词输出,并求其中最长单词的长度,并将该单词输出。 (4)编写一个程序实现如下功能:有8位裁判为1个...
  • /*最后一个字符休存包括最后一个字符在内的所填充的字符数量水 plainblockl7-8-count DES EncryptBlock (plainBlock, subkeys, cipherBlock fwrite(cipherBlock, sizeof (char), 8, cipher) fclose (plain) f'c. ...
  • PLT2KMLX14解决最后一行的问题 20110721 0931.7z WPT2KMLx4解决空行末行 20110721 0948.7z WPTPLT2KMLx12PLTWPT初步 20110721 1006.7z OZI格式的轨迹文件转KML格式的轨迹文件。 原理:ASC(转换) 转 UNICODE 转 ...
  • PLT2KMLX14解决最后一行的问题 20110721 0931.7z PLT2KML 改CString完工 20120731 1632.7z WPT2KMLx4解决空行末行 20110721 0948.7z WPT2KML 改CString完工 20120731 1700.7z WPT2KML 全部改CString慢 改strcat慢 ...
  • PLT2KMLX14解决最后一行的问题 20110721 0931.7z WPT2KMLx4解决空行末行 20110721 0948.7z WPTPLT2KMLx12PLTWPT初步 20110721 1006.7z OZI格式的轨迹文件转KML格式的轨迹文件。 原理:ASC(转换) 转 UNICODE 转 ...
  • PLT2KMLX14解决最后一行的问题 20110721 0931.7z PLT2KML 改CString完工 20120731 1632.7z PLT2KML 20110811 1047 处理单文件.7z PLT2KML 20120813 1815 处理子目录.7z WPT2KMLx4解决空行末行 20110721 0948.7z WPT2...
  • PLT2KMLX14解决最后一行的问题 20110721 0931.7z PLT2KML 改CString完工 20120731 1632.7z PLT2KML 20110811 1047 处理单文件.7z PLT2KML 20120813 1815 处理子目录.7z PLT2KML 20120831 0934 处理子目录.7z WPT2...
  • //将指针s所指的一串结点链接在线性链表L的最后一个结点 //之后,改变链表L的尾指针指向新的尾结点 /*******************************函数部分****************************************/ Status StrAssign(HString...
  • 处理包括读取文件,将其分成一行行的文字,然后将每行 解析成零或更多的符号。然后用已找到的符号字符串变量值 调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开 的第一个空白符号。跳过空白行。您可...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    文件为doc版,可自行转成txt,在手机上看挺好的。 本资源来自网络,如有纰漏还请告知,如觉得还不错,请留言告知后来人,谢谢!!!!! 入门学习Linux常用必会60个命令实例详解 Linux必学的60个命令 Linux提供...
  • 如果想要强行转换变量类型,可以使用与C语言相同的函数settype()。 2.5 变量与常量 可能你已经注意到,变量都有个美元符号($)的前缀。所有变量都是局部变量,为了使得定义的函数中可以使用外部变量,使用...
  • 问题由文本组成,其中包括多行文件以及一系列可能的答案,这两个结构都可由数组表示,问题的文本是字符串的数组,每一个字符串包含了一行的内容。而答案存储在一个结构较为复杂的数组中 通常情况下,需要提供一个...
  • 问题由文本组成,其中包括多行文件以及一系列可能的答案,这两个结构都可由数组表示,问题的文本是字符串的数组,每一个字符串包含了一行的内容。而答案存储在一个结构较为复杂的数组中 通常情况下,需要提供一个...
  • Dos命令大全

    2013-01-08 15:33:00
    处理包括读取文件,将其分成一行行的文字,然后将每行 解析成零或更多的符号。然后用已找到的符号字符串变量值 调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开 的第一个空白符号。跳过空白行。您可通过...
  • copy 1st.jpg/b+2st.txt/a 3st.jpg 将2st.txt的内容藏身到1st.jpg中生成3st.jpg新的文件,注:2st.txt文件头要空三排,参数:/b指二进制文件,/a指ASCLL格式文件 copy ipadmin$svv.exe c: 或:copyipadmin$*.* 复制...
  • Java开发技术大全(500个源代码).

    热门讨论 2012-12-02 19:55:48
    FileList.java 自己实现的文件名称枚举类 MyDataIO.java 数据输入输出示例 MyFileOutput.java 将键盘读入的文字保存到文件 MyPipedIO.java 管道流示例 MySequenceIn.java 顺序输入流示例 ObjectFileTest....

空空如也

空空如也

1 2
收藏数 36
精华内容 14
关键字:

c语言读取txt文件最后一行

c语言 订阅