`
yidongkaifa
  • 浏览: 4154346 次
文章分类
社区版块
存档分类
最新评论

Linux读取一行文本的方法

 
阅读更多

第一种方法:

1.网上流行的一个方法: 打印出每行的文本信息。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
     FILE * fp;
     char * line = NULL;
     size_t len = 0;
     ssize_t read;

     fp = fopen("test.txt", "r");
     if (fp == NULL)
         exit(EXIT_FAILURE);

     while ((read = getline(&line, &len, fp)) != -1) {
         printf("Retrieved line of length %zu :\n", read);
         printf("%s", line);
     }
     
     if (line)
         free(line);
     exit(EXIT_SUCCESS);
}


2.我自己稍作修改,取得指定行数的文本信息。

#include <stdio.h>
#include <stdlib.h>

int get_file_line(char *pInputName, char *pOutputBuf, int cnt)
{
	FILE * fp;
	int i=0;
	char * line = NULL;
	size_t len = 0;
	ssize_t read;

	fp = fopen(pInputName, "r");
	if (fp == NULL)
	 return -1;

	if(cnt<=0)
		 return -2;
		 
	while ((read = getline(&line, &len, fp)) != -1) {
		++i;
		if(i>=cnt)
			break;
	}

	if (line)
	{
		memcpy(pOutputBuf,line,strlen(line));
		free(line);
		return 0; 
	}

	return -3;
}

int main(void)
{
	char name[20]="test.txt";
	char buf[256]={0};
	int j;
	for(j=1;j<8;++j)
	{
		memset(buf,0,256);
		get_file_line(name,buf,j);
		printf("[%d] == %s",j,buf);
	}
	printf("\n");
  
}


执行以下,结果如图:

在此处做一个小小的拓展,就是在每行的文本信息中提取我们想要的信息:

#define dIndexName "WWW"

#define NAME_LEN_MAX 7

void GetName(void)
{
	int i;
	
	char *p=NULL;
	char line[30]={0};
	char dest_name[20]={0};
	char pFileName[256]="test.txt";
	
	get_file_line(pFileName,line,1);


	printf("line === %s \n",line);
	if((p=strstr(line,dIndexName))&&(p=strchr(line,':')))
	{
		memcpy(dest_name,p+1,NAME_LEN_MAX);
	}


	
	for(i=0;i<NAME_LEN_MAX;++i)
	{
		printf("[%d] === %c \n",i,dest_name[i]);
	}
}


执行结果,如下所示:

第二种方法:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

typedef unsigned char u8;

int get_file_line(char *pInputName, int line)
{
	char pTempString[256];

	u8 *pTempBuffer;
	int tTempFile,tTempFileLen;

	int i,m,n;
	u8 tTempFlag,tTempCmdFlag;
	{
		tTempFile=open(pInputName,O_RDONLY);
		if(tTempFile>=0)
		{
			tTempFileLen=lseek(tTempFile,0,SEEK_END); 
			lseek(tTempFile,0,SEEK_SET); 
			tTempCmdFlag=1;
			if( NULL!=(pTempBuffer=(u8 *)malloc(tTempFileLen)) )
			{
				if( tTempFileLen==read(tTempFile,pTempBuffer,tTempFileLen) )
				{
					m=n=0;
					tTempFlag=0;
					while(n<tTempFileLen)
					{
						if( tTempFlag )
						{
							if( pTempBuffer[n]<0x20)
							{
								if( tTempFlag )
								{
									if( n>m )
									{	
										memcpy(pTempString,pTempBuffer+m,n-m);
										pTempString[n-m]=0;
										printf("String1 %s \n",pTempString);
									}	
									tTempFlag=0;
								}
							}
						}else if( pTempBuffer[n]>=0x20 )
						{
							m=n;						
							tTempFlag=1;
						}
						n++;
					}
					if( (n>m)&&(tTempFlag) )
					{
						memcpy(pTempString,pTempBuffer+m,n-m);
						pTempString[n-m]=0;
						printf("String2 %s \n",pTempString);
					}			
					tTempCmdFlag=0;
				}
				free(pTempBuffer);
			}
			close(tTempFile);			
			return tTempCmdFlag;
		}
	}	
	return 2;
}

void main(void)
{
		char name[20]="tmp.txt";
		get_file_line(name,0);
		
}


有点长,但是也算一种办法啦。

分享到:
评论

相关推荐

    linux C++ 文本文件创建写入以及读取

    `std::getline()`函数用于读取一行内容。 3. **同时读写文件**: 如果需要同时读写文件,可以使用`fstream`类。例如: ```cpp std::fstream file("test.txt", std::ios::in | std::ios::out); if (!file) { ...

    dos读取文件某一行.rar

    在DOS环境下,没有像Linux的`head`和`tail`这样的内置命令来直接读取文件的第一行或最后一行。不过,我们可以利用内部命令如`type`和`findstr`来实现类似的功能。 首先,让我们来看看如何使用`type`命令。`type`...

    read-data-(fortran).zip_读取文本 Linux

    `read(unit, '(A)', iostat=iostat)`读取一行文本数据,并将其存储在`line`变量中。 如果你的文本文件包含特定格式的数据,例如数值或特定的分隔符,你可能需要使用不同的格式描述符来解析数据。例如,如果数据以...

    linux 下读取文件并输出其 16 进制

    这段代码打开指定的文件,读取内容,并以16进制格式一行接一行地打印出来。`Makefile`则用于编译这个程序,通常包含以下内容: ```makefile CC = gcc CFLAGS = -Wall all: readimage readimage: readimage.c $...

    linux文本转换程序

    这个程序,名为`LinuxTxtToWindowsTxt.exe`,可能是用C、C++或其他编程语言编写的,其功能是读取Linux格式的文本文件,将其中的LF行结束符替换为CRLF,确保在Windows环境下正常显示。 使用这个程序的步骤通常包括...

    Linux到WINDOWS文本文件转换程序

    为了解决这个问题,这个名为"nx2xp"的程序可能是用Python、Perl、awk或其他类似脚本语言编写的,其工作原理可能是读取Linux格式的文件,然后在每一行末尾添加缺失的CR字符,从而将其转换为Windows可识别的格式。...

    LINUX处理文本命令

    LINUX处理文本命令 处理文本和文本文件的命令 一. sort 文件排序, 通常用在管道中当过滤器来使用. 这个命令可以依据指定的关键字或指定的字符位置, 对文件行进行排序. 使用-m选项, 它将会合并预排序的输入文件. 想...

    Linux教程-linux文本处理-sed.docx

    sed 的工作原理是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(Pattern Space),接着用 ...

    读取指定文件每行并运行cmd命令

    标题 "读取指定文件每行并运行cmd命令" 涉及的核心知识点是通过编程方式读取文本文件的每一行内容,并将这些内容作为命令在命令行(CMD)环境中执行。这种操作通常在自动化脚本或者系统管理任务中非常有用。下面我们...

    Linux文本处理命令合集

    - `awk`以逐行的形式处理文件,首先执行`BEGIN`语句块,然后循环读取每一行执行`pattern`语句块,最后执行`END`语句块。 - 基本选项:`awk`还支持各种选项来增强其功能,如`-F`用于指定字段分隔符等。

    C++逐行读取文本文件

    在这个例子中,我们使用`std::getline()`函数读取文件的每一行。这个函数接受三个参数:输入流,用于存储读取行的字符串变量,以及一个分隔符(通常为'\n',表示行结束符)。当文件读取完成后,记得关闭输入流,这是...

    Linux中sed如何处理文本

    一旦处理完毕,sed输出当前行的内容,并读取下一行到模式空间中,然后重复应用编辑命令。这个过程一直持续到文件的最后一行。 如果sed中有多个编辑命令,它们的顺序会影响处理的结果。例如,sed 's/pig/cow/;s/cow/...

    Linux中Shell截取某行某列信息

    使用sed抓取第二行,-n ‘2p’代表第二行,-n ‘1,3p’代表第一到三行,以回车换行符区分。执行 udhcpc | grep “DNS” | sed -n ‘2p’ 使用awk抓取第四列,$4代表第四列,以空格区分。执行 udhcpc | grep “DNS”...

    利用Shell脚本循环读取文件中每一行的方法详解

    前言 本文主要给大家介绍了关于使用Shell脚本循环读取文件每一行的相关内容,分享出来供大家参考学习,下面话不多说...While循环中read命令从标准输入中读取一行,并将内容保存到变量line中。在这里,-r选项保证读入的

    linux 下实现对ini文件的读取和写入

    例如,`fopen()`用于打开文件,`fgets()`用于读取一行,`fscanf()`用于解析格式化的输入,`fprintf()`用于格式化输出,而`fclose()`则用于关闭文件。 2. **解析ini文件结构** ini文件的结构主要包括三部分:节、键...

    14-Java操作Linux命令分割合并文本文件1

    例如,使用`FileInputStream`, `BufferedReader`, `Files.lines()`等方法,可以读取文件并按行处理,避免一次性加载整个文件。 这些技术在处理大型文本数据时非常实用,尤其是当内存有限或需要分布式处理时。通过...

    vb读取txt文件

    可以使用类似读取TXT文件的方法来读取BAT文件的文本内容。 4. 读取整个文本文件内容: - 如果你需要一次性读取整个文本文件的内容,可以使用`Input`函数。例如,`lenfile = LOF(filenum)`获取文件长度,`strfile =...

    Linux教程-linux文本处理-awk.docx

    Linux系统中的文本处理工具众多,其中awk是被誉为“文本处理三剑客”之一的重要成员。awk的名字来源于其三位创始人——Aho, Weinberger, Kernighan的首字母缩写,它最初是在AT&T实验室开发的。现在,我们最常见的awk...

Global site tag (gtag.js) - Google Analytics