user-0 提问: C语言  readLine函数   处理大于缓存区字节的问题

回复:
user: user-1
content: 引用 5 楼 duqi_2009 的回复:[quote=引用 4 楼 richyhuang 的回复:] 如果那么没把握，建立一个链表数组也是可以的 不用担心会越界，除非系统内存不够  建立链表数组？？不是太明白您的意思  另外，这个问题，由于read系统调用会记录上次读的位置，所以，我想采取不丢弃的策略，然后当发现有没有完整接收的一行时就再次读取即可[/quote]  链表数组就是节点只有1个元素的数组啊, 不然你用list模板也可以 ,反正你这个长度不确定的情况下,就使用动态数据结构就好了.

user: user-2
content: 引用 3 楼 zhao4zhong1 的回复:仅供参考#include <stdio.h> #include <string.h> #define MAXLEN 1000 char ln[MAXLEN]; FILE *f; int i,z; int b,n,L; int main(int argc,char **argv) {     if (argc<2) {         printf("Usage:%s fullpathfilename.ext\nget total blank/non-blank/total linenumbers.\n",argv[0]);         return 1;     }     f=fopen(argv[1],"r");     if (NULL==f) {         printf("Can not open file [%s]!\n",argv[1]);         return 2;     }     z=0;     b=0;     n=0;     L=0;     while (1) {         if (NULL==fgets(ln,MAXLEN,f)) break;         L=strlen(ln);         if ('\n'==ln[L-1]) {             if (0==z) {                 for (i=0;i<L-1;i++) {                     if (!(' '==ln[i] || '\t'==ln[i])) break;                 }                 if (i<L-1) z=1;//当前行不是空行             }             if (0==z) b++; else n++;             z=0;         } else {             if (0==z) {                 for (i=0;i<L;i++) {                     if (!(' '==ln[i] || '\t'==ln[i])) break;                 }                 if (i<L) z=1;//当前行不是空行             }         }     }     fclose(f);     if (L>0 && '\n'!=ln[L-1]) {         if (0==z) b++; else n++;//最后一行末尾无'\n'也计算     }     printf("File:[%s] total blank/non-blank/total linenumbers is %d/%d/%d\n",argv[1],b,n,b+n);     return 0; }   赵老师。 话说 这个代码能不能规范点， int。。abcdefg 然后不够了 就aabbccdd 不要贪图快就随便abcd的。容易误导人啊 心急吃不了热豆腐

user: user-0
content: 引用 4 楼 richyhuang 的回复:如果那么没把握，建立一个链表数组也是可以的 不用担心会越界，除非系统内存不够  建立链表数组？？不是太明白您的意思  另外，这个问题，由于read系统调用会记录上次读的位置，所以，我想采取不丢弃的策略，然后当发现有没有完整接收的一行时就再次读取即可

user: user-3
content: 仅供参考#include <stdio.h> #include <string.h> #define MAXLEN 1000 char ln[MAXLEN]; FILE *f; int i,z; int b,n,L; int main(int argc,char **argv) {     if (argc<2) {         printf("Usage:%s fullpathfilename.ext\nget total blank/non-blank/total linenumbers.\n",argv[0]);         return 1;     }     f=fopen(argv[1],"r");     if (NULL==f) {         printf("Can not open file [%s]!\n",argv[1]);         return 2;     }     z=0;     b=0;     n=0;     L=0;     while (1) {         if (NULL==fgets(ln,MAXLEN,f)) break;         L=strlen(ln);         if ('\n'==ln[L-1]) {             if (0==z) {                 for (i=0;i<L-1;i++) {                     if (!(' '==ln[i] || '\t'==ln[i])) break;                 }                 if (i<L-1) z=1;//当前行不是空行             }             if (0==z) b++; else n++;             z=0;         } else {             if (0==z) {                 for (i=0;i<L;i++) {                     if (!(' '==ln[i] || '\t'==ln[i])) break;                 }                 if (i<L) z=1;//当前行不是空行             }         }     }     fclose(f);     if (L>0 && '\n'!=ln[L-1]) {         if (0==z) b++; else n++;//最后一行末尾无'\n'也计算     }     printf("File:[%s] total blank/non-blank/total linenumbers is %d/%d/%d\n",argv[1],b,n,b+n);     return 0; }

user: user-4
content: 看你是做什么用的 如果是文本编辑器，要强制换行，并且记录这个超长行被分成几行。 如果是数据处理，并且可以便读取边处理，那么先处理已经读进来的部分， 剩下的接着继续，可以采用双缓冲循环技术，也可以缓存几个字符，在这几个字符没处理完之前，不处理缓冲中的字符。 当然，如果是控制台输入输出处理，还可以unget 已经读取的字符，文件似乎也是可以的。

user: user-1
content: 如果那么没把握，建立一个链表数组也是可以的 不用担心会越界，除非系统内存不够

user: user-0
content: #include <unistd.h> #include <errno.h> #include "read_line.h"  ssize_t read_line(int fd, void *buffer, size_t n) { 	ssize_t numRead;	/* # of bytes fetched by last read()*/ 	size_t 	totRead;	/* Total bytes read so far*/ 	char *buf; 	char ch;  	if (n <= 0 || buffer == NULL){ 		errno = EINVAL; 		return -1; 	}  	buf = buffer; 	totRead = 0; 	for(;;){ 		numRead = read(fd, &ch, 1); 		if (numRead == -1){ 			if (errno == EINTR)     /*Interrupted ----> restart read()*/ 				continue; 			else 				return -1;			/* some other error*/ 		}else if (numRead == 0){	/* EOF*/ 			if (totRead == 0)		/* No bytes read so far, return 0*/ 				return 0; 			else					/* Some bytes read so far, add '\0'*/ 				break; 		}else{						 			if (totRead < n-1){		/* Discard > (n-1) bytes */ 				totRead++; 				if (totRead == n-2)   /* 让readLine最多能读取n-1个字符，不包括null字符，并且不丢弃字节*/ 					break; 				*buf++=ch; 			}  			if (ch == '\n') 				break; 		} 	}  	*buf = '\0'; 	return totRead; }   但是，调用者又是如何处理读取部分行的情况呢？？？？