user-0 提问: 实现将文件最后一行写到该文件的第一行，覆盖第一行。

回复:
user: user-1
content: 引用 7 楼 hmz6285603 的回复:[quote=引用 6 楼 my_live_123 的回复:] [quote=引用 5 楼 hmz6285603 的回复:] [quote=引用 4 楼 my_live_123 的回复:]  #include <stdio.h> #include <stdlib.h> #include <string.h>  #define LINE_MAX 64 //bug:当最后一行长于第一行时，会覆盖掉第二行的一些字符，抛砖引玉吧，我不修复这个不过了 int last_to_first(char *path) { 	FILE *fp; 	char line[LINE_MAX + 1] = {0}; 	int i;  	fp = fopen(path, "r+"); 	if(fp == NULL) 		exit(0);  //第一行清空 	fgets(line, LINE_MAX, fp); 	fseek(fp, 0, SEEK_SET); 	for(i = 0; i < strlen(line); ++i) 		fputc('0', fp);  //取最后一行 	fseek(fp, -LINE_MAX, SEEK_END); 	do{ 		fgets(line, LINE_MAX, fp); 	} 	while(!feof(fp));  	//printf("%s\n", line); //填充第一行 	fseek(fp, 0, SEEK_SET); 	fputs(line, fp); 	fclose(fp); 	return 0; }  int main(int argc, char *argv[])  { 	if(argc != 2) 		return 1; 	last_to_first(argv[1]); 	return 0; }  还有两种方案，1.全部读取到数组中，处理完毕写回。2.写到另一个新建文件中，写的过程中进行调整 感觉不合理，一行可能少于64个字符或者多于64个字符。感觉这个方法不合适。[/quote] 那个只是最大值，少于64，正常运行，多余64个，你改成那个大值不就可以喽，我给你写成宏喽，就是这个目的[/quote] 最后一行，我们不知道有多少字符直接用这个“fseek(fp, -LINE_MAX, SEEK_END);”不合适吧。 [/quote] 比如一般的文本编辑器一行都不会超过256个字符，那么去过MAX=256,则如果最后一行正好256，那么fseek正好。如果没有这么多，fseek后fp指向位置可能还有几行，函数中不是有个do，while循环嘛，一次取一行，直到取到最后一行为止，循环结束后line存的就是最后一行喽

user: user-0
content: 引用 6 楼 my_live_123 的回复:[quote=引用 5 楼 hmz6285603 的回复:] [quote=引用 4 楼 my_live_123 的回复:]  #include <stdio.h> #include <stdlib.h> #include <string.h>  #define LINE_MAX 64 //bug:当最后一行长于第一行时，会覆盖掉第二行的一些字符，抛砖引玉吧，我不修复这个不过了 int last_to_first(char *path) { 	FILE *fp; 	char line[LINE_MAX + 1] = {0}; 	int i;  	fp = fopen(path, "r+"); 	if(fp == NULL) 		exit(0);  //第一行清空 	fgets(line, LINE_MAX, fp); 	fseek(fp, 0, SEEK_SET); 	for(i = 0; i < strlen(line); ++i) 		fputc('0', fp);  //取最后一行 	fseek(fp, -LINE_MAX, SEEK_END); 	do{ 		fgets(line, LINE_MAX, fp); 	} 	while(!feof(fp));  	//printf("%s\n", line); //填充第一行 	fseek(fp, 0, SEEK_SET); 	fputs(line, fp); 	fclose(fp); 	return 0; }  int main(int argc, char *argv[])  { 	if(argc != 2) 		return 1; 	last_to_first(argv[1]); 	return 0; }  还有两种方案，1.全部读取到数组中，处理完毕写回。2.写到另一个新建文件中，写的过程中进行调整 感觉不合理，一行可能少于64个字符或者多于64个字符。感觉这个方法不合适。[/quote] 那个只是最大值，少于64，正常运行，多余64个，你改成那个大值不就可以喽，我给你写成宏喽，就是这个目的[/quote] 最后一行，我们不知道有多少字符直接用这个“fseek(fp, -LINE_MAX, SEEK_END);”不合适吧。

user: user-1
content: 引用 5 楼 hmz6285603 的回复:[quote=引用 4 楼 my_live_123 的回复:]  #include <stdio.h> #include <stdlib.h> #include <string.h>  #define LINE_MAX 64 //bug:当最后一行长于第一行时，会覆盖掉第二行的一些字符，抛砖引玉吧，我不修复这个不过了 int last_to_first(char *path) { 	FILE *fp; 	char line[LINE_MAX + 1] = {0}; 	int i;  	fp = fopen(path, "r+"); 	if(fp == NULL) 		exit(0);  //第一行清空 	fgets(line, LINE_MAX, fp); 	fseek(fp, 0, SEEK_SET); 	for(i = 0; i < strlen(line); ++i) 		fputc('0', fp);  //取最后一行 	fseek(fp, -LINE_MAX, SEEK_END); 	do{ 		fgets(line, LINE_MAX, fp); 	} 	while(!feof(fp));  	//printf("%s\n", line); //填充第一行 	fseek(fp, 0, SEEK_SET); 	fputs(line, fp); 	fclose(fp); 	return 0; }  int main(int argc, char *argv[])  { 	if(argc != 2) 		return 1; 	last_to_first(argv[1]); 	return 0; }  还有两种方案，1.全部读取到数组中，处理完毕写回。2.写到另一个新建文件中，写的过程中进行调整 感觉不合理，一行可能少于64个字符或者多于64个字符。感觉这个方法不合适。[/quote] 那个只是最大值，少于64，正常运行，多余64个，你改成那个大值不就可以喽，我给你写成宏喽，就是这个目的

user: user-0
content: 引用 4 楼 my_live_123 的回复: #include <stdio.h> #include <stdlib.h> #include <string.h>  #define LINE_MAX 64 //bug:当最后一行长于第一行时，会覆盖掉第二行的一些字符，抛砖引玉吧，我不修复这个不过了 int last_to_first(char *path) { 	FILE *fp; 	char line[LINE_MAX + 1] = {0}; 	int i;  	fp = fopen(path, "r+"); 	if(fp == NULL) 		exit(0);  //第一行清空 	fgets(line, LINE_MAX, fp); 	fseek(fp, 0, SEEK_SET); 	for(i = 0; i < strlen(line); ++i) 		fputc('0', fp);  //取最后一行 	fseek(fp, -LINE_MAX, SEEK_END); 	do{ 		fgets(line, LINE_MAX, fp); 	} 	while(!feof(fp));  	//printf("%s\n", line); //填充第一行 	fseek(fp, 0, SEEK_SET); 	fputs(line, fp); 	fclose(fp); 	return 0; }  int main(int argc, char *argv[])  { 	if(argc != 2) 		return 1; 	last_to_first(argv[1]); 	return 0; }  还有两种方案，1.全部读取到数组中，处理完毕写回。2.写到另一个新建文件中，写的过程中进行调整 感觉不合理，一行可能少于64个字符或者多于64个字符。感觉这个方法不合适。

user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  #define LINE_MAX 64 //bug:当最后一行长于第一行时，会覆盖掉第二行的一些字符，抛砖引玉吧，我不修复这个不过了 int last_to_first(char *path) { 	FILE *fp; 	char line[LINE_MAX + 1] = {0}; 	int i;  	fp = fopen(path, "r+"); 	if(fp == NULL) 		exit(0);  //第一行清空 	fgets(line, LINE_MAX, fp); 	fseek(fp, 0, SEEK_SET); 	for(i = 0; i < strlen(line); ++i) 		fputc('0', fp);  //取最后一行 	fseek(fp, -LINE_MAX, SEEK_END); 	do{ 		fgets(line, LINE_MAX, fp); 	} 	while(!feof(fp));  	//printf("%s\n", line); //填充第一行 	fseek(fp, 0, SEEK_SET); 	fputs(line, fp); 	fclose(fp); 	return 0; }  int main(int argc, char *argv[])  { 	if(argc != 2) 		return 1; 	last_to_first(argv[1]); 	return 0; }  还有两种方案，1.全部读取到数组中，处理完毕写回。2.写到另一个新建文件中，写的过程中进行调整

user: user-2
content: 写临时文件。

user: user-0
content: 引用 1 楼 icesky1stm 的回复:lseek，和操作数组的原理没啥区别。 具体怎么实现，教下。菜鸟，呵呵

user: user-3
content: lseek，和操作数组的原理没啥区别。