user-0 提问: 一道作业题，我想破脑子还是没有头绪关于从txt文件读取字符然后在cmd输出

回复:
user: user-1
content: C++ iostream里面中有相关文件读取的类对象，读起来很方便

user: user-2
content: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h>   #define MAX_PICTURES (100)  typedef struct picinfo { 	char key[100];  // 图片名称 	int lines;		// 图片的行数 	char * imageData;	// 图片数据的指针 	int cbImageData;	// 图片数据的字节数 }picinfo_t;  size_t read_file(const char * file_name, char ** pp_buffer) { 	FILE * fp; 	char * buffer = NULL; 	assert(NULL != pp_buffer); 	 	buffer = *pp_buffer; 	 	long int size; 	fp = fopen(file_name, "r"); 	if(NULL == fp) 	{ 		perror("fopen"); 		return 0; 	} 	 	fseek(fp, 0, SEEK_END); 	size = ftell(fp); 	fseek(fp, 0, SEEK_SET); 	 	if(size == -1) 	{ 		perror("ftell"); 		return 0; 	} 	 	if(size == 0) return 0; 	 	 	if(NULL == buffer) 	{ 		buffer = (char *)malloc(size + 1); 		assert(NULL != buffer); 	} 	 	 	if(1 != fread(buffer, size, 1, fp)) 	{ 		free(buffer); 		return 0; 	} 	buffer[size] = '\0'; 	if(NULL != pp_buffer && NULL == *pp_buffer) *pp_buffer = buffer; 	 	fclose(fp); 	return size; }  static char * skip_lines(char * iter, int nLines) { 	char * p = iter; 	 	while(nLines > 0) 	{ 		p = strchr(p, '\n'); 		if(NULL == p) return NULL; 		p++; 		nLines--; 	} 	return p; }  int main(int argc, char **argv) { 	int rc; 	const char * file_name = "pictures.txt"; 	char * buffer = NULL; 	char * p; 	size_t cbBuffer; 	 	picinfo_t pics[MAX_PICTURES] = {0}; 	int count = 0; 	int i; 	 	// 把文件全部读入一个缓冲区 	cbBuffer = read_file(file_name, &buffer); 	if(0 == cbBuffer) 	{ 		fprintf(stderr, "read file failed.\n"); 		exit(1); 	} 	 	// 解析从文件中读取的数据，并将相关信息（如名称、长度等）转存至自定义的picinfo_t数组 	p = buffer; 	while(p && (count < MAX_PICTURES)) 	{	 		if(*p == '/' && *(p + 1) == '/')  // 跳过注释行 		{ 			p = skip_lines(p, 1); 			continue; 		} 		if(*p == '\n') // 跳过空白行 		{ 			p = skip_lines(p, 1); 			continue; 		} 		 		// 读取缓冲区中读取图片名称和行数 		rc = sscanf(p, "%s %d", pics[count].key, &pics[count].lines);		 		if(rc != 2 || pics[count].lines <= 0)  		{ 			break; 		} 		 		// 移至下一行 		p = skip_lines(p, 1); 		pics[count].imageData = p;	// 保存图片数据的起始位置的指针 		 		// 移至图片数据末尾 		p = skip_lines(p, pics[count].lines); 		pics[count].cbImageData = p - pics[count].imageData; // 确定图片大小（字节数） 		 		++count; 		if(NULL == p) break; 	} 	 	printf("Pictures list:\n"); 	printf("===================================\n"); 	for(i = 0; i < count; i++) 	{ 		printf("%d: [%s], lines = %d\n", i, pics[i].key, pics[i].lines); 		 	} 	printf("===================================\n\n"); 	 	picinfo_t search = {0}; 	 	 	size_t cb; 	 	while(1) 	{ 		printf("Please input the picture name and preferred lines: \n" 			"example: gun 3\n" 			"(input 'quit 0' to exit)\n"); 		rc = scanf("%s %d]", search.key, &search.lines); 		if(rc == 0 || rc > 2) break; 		 		// 如果输入"quit 0" 则退出程序 		if(strncasecmp(search.key, "quit", 4) == 0) break; 		 		// 在pics数组中查找是否有与用户输入名称相匹配的项 		for(i = 0; i < count; i++) 		{ 			if(strncasecmp(pics[i].key, search.key, sizeof(pics[i].key)) == 0) 			{ 				break; 			} 		} 		 		if(i == count) // 没有 		{ 			printf("not found.\n"); 			continue; 		} 		 		// 默认输出的字节数为整个图片的字节数 		cb = pics[i].cbImageData; 		if(rc == 2) 		{ 			// 如果用户输入的行数为负值，则退出程序			 			if(search.lines < 0) break; 			 			// 如果行数为0或大于实际图片的行数，则调整输出行数为实际图片的行数 			if((search.lines == 0) || (search.lines > pics[i].lines)) search.lines = pics[i].lines; 			else if(search.lines < pics[i].lines) 			{ 				// 如果用户输入的行数小于实际行数，则计算此次输出所需的字节数 				p = pics[i].imageData; 				p = skip_lines(p, search.lines); 				cb = p - pics[i].imageData; 			} 		} 	 		// 输出指定字节数的图片数据到stdout 		fwrite(pics[i].imageData, cb, 1, stdout); 	} 	 	free(buffer); 	 	return 0; }

user: user-3
content: 这个没规律寻吧  要是我就直接一整个输入输出

user: user-4
content: 偷懒的办法是直接数~

user: user-5
content: 整个读进来整个一起输出，不需要一行一行

user: user-0
content: 我想用gets()函数来做，但是我不知道要怎么确定Snoopy 13这些标题的位置和要输出多少行！