精华内容
下载资源
问答
  • 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:~$ 
    
    展开全文
  • 在使用c语言cgi处理表单方式上传文件时,解析post过来数据,发现客户端传来数据中,行尾回车换行 \r\n(crlf)在使用读接口fgetc从标准输入中读时,数据变成了\n(lf),导致按照content-length长度读时挂死在...

    在使用c语言写的cgi处理表单方式上传文件时,解析post过来的数据,发现客户端传来的数据中,行尾的回车换行 \r\n(crlf)在使用读接口fgetc从标准输入中读时,数据变成了\n(lf),导致按照content-length长度读时挂死在那里,服务器使用的是win7下的iis,换了linux下的shttpd服务器 就是正常数据。现在还没有找到具体的原因,在网上搜索也只有一两个人遇到过这个问题,但是也没有直接解决 ,而是规避了。先记录下,后续有时间再继续定位补充。

    定位结论:
    由于在windows下,C/C++提供的标准输入stdin默认是以"r"模式打开的,在Linux下由于"r"和"rb"效果相同,因此不会受到影响。在Windows下,"r"意味着文本模式,\r\n会被转换成\n,而且遇到EOF就会停止。

    因此为了从标准输入读取二进制数据之前,需要将属性设置为二进制模式,使用以下代码以下代码:

    #include <io.h>
    #include <fcntl.h>

    _setmode(_fileno(stdin), _O_BINARY);

    测试ok。

    展开全文
  •  //读取文件的每一行,并去掉换行符号 for (i = 1; i; i++) { printf("%s\n",ReadSpeacialLine(i)); //分割为前7位 strncpy(a1,ReadSpeacialLine(i),7);  *(a1+7)='\0'; printf("%s\n",a1)...


    #include <stdio.h>

    #include <ctype.h>
    #include <string.h>
    #include <stdlib.h>
    #include <dir.h>

    //*********************************
    //字符串连接函数
    char *catstr(char *a,char *b)
    {
      char *p =a, *q=b;
      while(*p) p++;
      while(*q) *p++ =*q++;
      *p ='\0';
      return a;
    }
    //***********************************
    //读取SN.txt的每行字符串
    char *ReadSpeacialLine(int WhichLine)
    {
    char StrLine[1024];
    FILE *fp;
    int CurrentIndex = 0;
    char filename[] = "demo.TXT";
    if((fp = fopen(filename, "r")) == NULL)
    {     
    printf("Open file SN.txt Error\n");
    return NULL;
    }


    while(!feof(fp))
    {
    if(CurrentIndex == WhichLine - 1)
    {
    fgets(StrLine, 1024, fp);
    //printf("%s", StrLine);
    if ( (StrLine[strlen(StrLine)-1]) == '\n' )
    StrLine[strlen(StrLine)-1] ='\0';
    return StrLine;
    }
    fgets(StrLine, 1024, fp);
    CurrentIndex++;
    }
    fclose(fp);
    return NULL;
    }
    //***************************************

    int main(void)
    {
    char str[20];
    FILE *fp;
    FILE *fpread;
    char readsn[15];
    int i, l;
    char a1[7],a2[3];
    char filename[14];

    fp = fopen ("demo.txt","wt+");
    if(fp == NULL)
    {
    printf("create file demo.txt failed!\n");
    exit(1);
    }
    //循环输入SN,存入文件demo.txt
    for( i =0 ; i <3;i++)
    {
    printf("Please input SN:\n");
    //fgets(str,11,stdin);
    gets(str);
    printf("%d\n",strlen(str));
               //判断SN是否为10位
       while( 10 !=strlen(str))
    {
     printf("Please input SN again:\n");
     //fgets(str,11,stdin);
     gets(str);
     printf("%d\n",strlen(str));
    }

    //将输入的小写字母转换为大写
    for (l = 0; l <=strlen(str); l++)
    {
    if(str[l]>='a' && str[l]<='z')
    str[l] -= 32;
    }
    fputs(str,fp);
    fputs("\n",fp);
    }

    fclose(fp);
    /*
    //读取文件的第一行
    fpread=fopen("demo.txt","r");
    fgets(readsn,11,fpread);
    printf("%s\n",readsn);
    fclose(fpread);
    */
        
       //读取文件的每一行,并去掉换行符号
    for (i = 1; i<=3; i++)
    {

    printf("%s\n",ReadSpeacialLine(i));

    //分割为前7位

    strncpy(a1,ReadSpeacialLine(i),7);
                    *(a1+7)='\0';
    printf("%s\n",a1);
    system("pause");

    //分割为后3位

    strncpy(a2,ReadSpeacialLine(i)+7,strlen(ReadSpeacialLine(i))-7+1);
                   *(a2+strlen(ReadSpeacialLine(i))-7)='\0';
      printf("%s\n",a2);
    system("pause");
    //链接为需要的格式1234567.890
    sprintf(filename,"%s.%s",a1,a2);
    printf("%s\n",filename);
    system("pause");

        }
    return 0;

    }


    /*BC 编译过验证OK*/

    展开全文
  • C语言中如何简单的读取文件中的数据!

    万次阅读 多人点赞 2018-07-13 19:17:07
    #include&lt;stdio.h&gt; void main() { FILE *fw=fopen("D:\\data.txt","r"); int i,j,a[4][5]; for(i=0;i&...//读取文件数据,遇到空格和换行停止读。 ...
    #include<stdio.h>
    void main()
    {
    	FILE *fw=fopen("D:\\data.txt","r");
    	int i,j,a[4][5];
    	for(i=0;i<4;i++)
    		{
    		for(j=0;j<5;j++)
    		{
    			fscanf(fw,"%d",&a[i][j]);//读取文件中的数据,遇到空格和换行停止读。
    			printf("%d\t",a[i][j]);//将文件打印出来。
    		}
    			printf("\n");
    		}
    	fclose(fw);
    }

    在这里先在D盘里便创建一个data的txt文件,放进数据即可读出来。


    运行结果:


    展开全文
  • 文件的最后是有一个EOF,代表着文件的结束。 我们在文件中用肉眼看到的换行实际上反映到内存中是一个换行符。换行符紧挨着的下一个字节保存的是下一行的第一个字符。 2.操作系统读取文件时,是有一个指针的,...
  • C语言文件的常用操作

    2012-12-06 15:00:54
    1.getchar 和getc 区别  getchar 对应输入设备是键盘。  getc 对应输入设备... gets 从标准输入设备(键盘)中读取一个字符串,遇到换行结束,换行符结束,并在末尾添加 "\0".  fgets 从文件字节流中读取
  • C语言读取一行TXT文件 && 修改TXT中内容

    千次阅读 多人点赞 2020-12-22 17:16:55
    事情是这样,给出一个TXT文本文件,里面存储有多条数据,将数据插入数据库。 每条数据格式: `BH001;属性1;属性2;属性3;属性4;属性5;` 但是给出文档有问题,会有多出换行的数据,无法正确插入 `BH001;属性1;...
  • 在不同操作系统中,换行符存储方式不同,如linux系统以\n表示,而Mac OS以\r表示,windows系统则以\r\n表示,而C语言中,换行则以\n表示,故在不同操作系统下用C语言读取文本文件时,需要做相应处理,本文...
  • C语言文件读写操作之换行符处理

    千次阅读 2020-08-04 00:11:52
    windows下每个文件中正确的换行符号是:\r\n \r 0D \n 0A t模式(缺省):读取windows文件时将\r\n在读取过程中合并为\n t模式写入文件时会将\n换行符,在写入时加入\r称为\r\n换行符形式 b模式是按文件原本\
  • 读操作主要用的是fscanf函数,fscanf函数有个特点,就是碰到空格和换行会自动中断当前变量的读取。然后下次读操作自动跳过空格和换行。 代码 #include <stdio.h> #include <stdlib.h> int main() { ...
  • 一、编程思想: 1.以文本方式打开文件。 2.循环用fscanf格式化输入数据到数组。...1.设定文件名为in.txt, 存有一系列整型数据,以空格或换行分隔。 #include int main() {  int v[100];//开一个足够大数组。
  • C语言读写文件与二进制文件

    千次阅读 2017-08-26 16:24:56
    读写文件有“w”和“wb”格式,分别是以文本形式读写...1、文本方式读取要把回车,换行两个字符变成一个字符,相当于截短了文件。 2、文本形式和二进制形式适用结束符和读写函数不同。尤其是结束符问题,很困扰人。
  • //fp = fopen(“D:\visualcode\C语言读取及修改简单配置文件内容\test_fprintf\my_config”, “r”); //char buffer[200]; //while (fscanf(fp, “%*[ ]”)!=EOF && fscanf(fp, “%s”, buffer)!=EOF)//跳过...
  • 一次性从stream读入nmemb个size字节(含换行回车)到ptr中,如果不遇到文件结束,返回正确完整读取size字节次数, 如果遇到文件结束,那最后一次读取size次数就是0。 比如:文件大小=55 size=10; nmemb=4; 第一次...
  • 编译预处理(C语言) 使用文件形式输入源程序,输出也写入...首先准备好文档,使用fopen函数选择读入或写出方式,采用fgets和fgetc函数进行读取字符或字符串进行相应处理 fr=fopen(“a.txt”,“r”);从名为a.tx...
  • “使用 fgets() 读取一个ASCII编码文本文件内容,向控制台逐行输出其中所有文本。” 你能很轻松做对这个题目吗?SHOW一段代码来看看。 你写代码是100%正确吗?会有重大缺陷吗?重点思考以下几点: ...
  • 此外,需在结尾下一行(就是要换行后再输入)才有效,否则程序无反应。 还有,程序会读取最后一个换行符(即为了使输入有效而键入最后一个换行符)。 1.此为无效模拟 2.此为有效模拟
  • fgets(由文件读取一字符串) 相关函数 ...函数说明 fgets()用来从参数stream所指的文件内读入字符并存到参数s所指内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串
  • 以读方式读取二进制文件,发现存在字节丢失情况 改成 fread(xxxxx,"rb"); 以二进制方式读取 原因: fread以文本形式读取对0x0D 0x0A会变成0x0A 【C语言】fwrite 写如0X0A时,自动添加0X0D解决方法...
  • c语言之数单词游戏

    2019-10-09 15:28:12
    1:给定一个特定的文件,用c语言程序读取。输出文件一共有多少个单词,并且返回这个值。 2:考虑大数据处理方式,如果文件特别大,要求buff数据区不能超过20字节并且完成需求。既多次读取调用函数完成此功能。 3:...
  • c语言小知识汇总

    2011-03-07 23:52:00
    得到int的最大值: #include ... printf("%d",INT_MAX); ...打开文件的代码: FILE *fin,*fout;... //fgetc()用来读取单个字符,值得注意的是它也可读取换行 符,所以记得用它把多余的换行符吃掉。
  • C语言编程中,fputs()和fgets()函数用于从流中写入和读取字符串。 下面来看看看如何使用fgets()和fgets()函数写和读文件。 写文件:fputs()函数 fputs()函数将一行字符串写入文件,它将字符串输出到流。 其行为...
  • 本来是想每次 32KB 的读取,最后合并成一个完成的文件。 后来,出现了上下文的衔接问题。总是多个字符 0xD3 ,直到现在位置,也没有弄明白它是哪来的。 有谁知道告诉我一下。 最后,还是每次 32KB 的读,不过只处理...
  • C语言中怎么把空格保存到字符串中

    千次阅读 2016-01-25 19:30:44
    C语言编程中,怎么把空格写入字符串中? ...调用中gets()函数char array[16];...这里面%[^\n]中 ^ 意思是除了,即除非遇到换行转义字符否则继续输入。...另外经过测试,在C语言读取文件
  • 注意以二进制文件和文本文件在读取上的区别(记住:对文件的操作写入方式与读取方式要保持一致)。 1、当按照文本方式向文件中写入数据时,一旦遇到“换行”字符(ASCII码为10),则会转换为“回车—换行”(ASCII...
  • 本来是想每次 32KB 的读取,最后合并成一个完成的文件。 后来,出现了上下文的衔接问题。总是多个字符 0xD3 ,直到现在位置,也没有弄明白它是哪来的。 有谁知道告诉我一下。 最后,还是每次 32KB 的读,不过只处理...
  • C语言 fgets函数与fputs函数用法

    千次阅读 2017-07-11 18:05:05
    (1)遇到换行文件结束EOF则返回。 (2)按行读取。 (3)每一行结束处的换行字符‘/n’也算该行字符。 (4)对于大小为sizebuf,最多只读取size-1个字符。 (5)自动地把buf中最后一个字符(通常是换行符)...
  • 然后使用如下四种读写文件的方法进行测试, 1、C语言函数fopen(),UNICODE版本是 _wfopen()。 2、C++ fstream 3、mfc CFile、CStdioFile类 4、采用WinCE的API CreateFile 其中每种方式都检测9种...

空空如也

空空如也

1 2 3
收藏数 58
精华内容 23
关键字:

c语言文件的读取换行

c语言 订阅