user-0 提问: fscanf读取带含有回车文件的最后一个数字

回复:
user: user-1
content: 引用 6 楼 chybeyond123456789 的回复:[quote=引用 3 楼 u012725046 的回复:] a+打开可以的 是fseek错了  大小不应该是偏移1个字节  fseek(fp, -sizeof(int), SEEK_END);      #include <stdio.h> int main() {     FILE *fp;     unsigned int flight_num;     unsigned int flag;     char flight_string[20];       fp = fopen("flight_num.txt", "r"); //第一次进入，文件不存在创建文件并写入0.     if (fp == NULL)     {         printf("open error!\n");         fp = fopen("flight_num.txt", "wt");         fprintf(fp, "%d\n\r", 0);         fclose(fp);     }     else     {         fclose(fp);         fp = fopen("flight_num.txt", "a+");         // printf("1th  %d\n",ftell(fp));         fseek(fp, -sizeof(int), SEEK_END);         // printf("2th  %d\n",ftell(fp));         fscanf(fp, "%d", &flight_num);          // printf("3th  %d\n",ftell(fp));         fprintf(fp, "%d\n\r", flight_num+1);          // printf("4th  %d\n",ftell(fp));         fclose(fp);         printf("%d", flight_num);     }     return 0; }  谢谢，但是这样只能计数到255，之后就从0开始了，怎么才能一直计数[/quote]  这个问题是之前没考虑到，文件中的都是char，直接用fseek移动sizeof(int)是4个字节，又从赵老师那长知识了  引用 5 楼 zhao4zhong1 的回复:不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  我是这么改的，直接fseek 4个字节，然后格式控制输出的格式，这么的话最多就只能到1000，然后从1开始，增加范围直接修改 移动字节数和格式控制就好了 PS：因为多个\n，所以fseek多移动了1鸽字节   fseek(fp, -4, SEEK_END); fprintf(fp,"%3d\n", flight_num+1);   效果图   代码   #include <stdio.h> int main() {     FILE *fp;     unsigned int flight_num;     unsigned int flag;     char flight_string[20];       fp = fopen("flight_num.txt", "r"); //第一次进入，文件不存在创建文件并写入0.     if (fp == NULL)     {         printf("open error!\n");         fp = fopen("flight_num.txt", "w+");         fprintf(fp, "%3d\n", 0);         fclose(fp);     }     else     {         fclose(fp);         fp = fopen("flight_num.txt", "a+");         fseek(fp, -4, SEEK_END);         fscanf(fp, "%d", &flight_num);            fprintf(fp,"%3d\n", flight_num+1);         fclose(fp);         printf("%d", flight_num);     }     return 0; }

user: user-2
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-3
content: 另外文件打开失败不一定表示文件不存在，可以使用API FindFirstFile 等方式

user: user-1
content: a+打开可以的 是fseek错了  大小不应该是偏移1个字节  fseek(fp, -sizeof(int), SEEK_END);      #include <stdio.h> int main() {     FILE *fp;     unsigned int flight_num;     unsigned int flag;     char flight_string[20];       fp = fopen("flight_num.txt", "r"); //第一次进入，文件不存在创建文件并写入0.     if (fp == NULL)     {         printf("open error!\n");         fp = fopen("flight_num.txt", "wt");         fprintf(fp, "%d\n\r", 0);         fclose(fp);     }     else     {         fclose(fp);         fp = fopen("flight_num.txt", "a+");         // printf("1th  %d\n",ftell(fp));         fseek(fp, -sizeof(int), SEEK_END);         // printf("2th  %d\n",ftell(fp));         fscanf(fp, "%d", &flight_num);          // printf("3th  %d\n",ftell(fp));         fprintf(fp, "%d\n\r", flight_num+1);          // printf("4th  %d\n",ftell(fp));         fclose(fp);         printf("%d", flight_num);     }     return 0; }

user: user-0
content: 引用 7 楼 qq_29120981 的回复:[quote=引用 3 楼 寒风_弄夜的回复:]a+打开可以的 是fseek错了  大小不应该是偏移1个字节  fseek(fp, -sizeof(int), SEEK_END);    #include <stdio.h> int main() {     FILE *fp;     unsigned int flight_num;     unsigned int flag;     char flight_string[20];       fp = fopen("flight_num.txt", "r"); //第一次进入，文件不存在创建文件并写入0.     if (fp == NULL)     {         printf("open error!\n");         fp = fopen("flight_num.txt", "wt");         fprintf(fp, "%d\n\r", 0);         fclose(fp);     }     else     {         fclose(fp);         fp = fopen("flight_num.txt", "a+");         // printf("1th  %d\n",ftell(fp));         fseek(fp, -sizeof(int), SEEK_END);         // printf("2th  %d\n",ftell(fp));         fscanf(fp, "%d", &flight_num);          // printf("3th  %d\n",ftell(fp));         fprintf(fp, "%d\n\r", flight_num+1);          // printf("4th  %d\n",ftell(fp));         fclose(fp);         printf("%d", flight_num);     }     return 0; }  谢谢，原来我理解错楼主的意思了[/quote] 没有，你的回答解决了我其中一个问题，我参考了另外一位楼主的答案

user: user-4
content: 不知道你是不是要读取最后一行的数字。 我改的是把最后一行的数字加1，再追加一行。   /* 保存的数字追加到最后一行。新添加的行，在行首添加换行符。数字后不加换行符  */  #include <stdio.h> #include <stdlib.h> int main() { 	FILE *fp; 	unsigned int flight_num; 	unsigned int flag; 	char flight_string[20];  	fp = fopen("flight_num.txt", "r"); //第一次进入，文件不存在创建文件并写入0. 	if (fp == NULL) 	{ 		printf("open error!\n"); 		fp = fopen("flight_num.txt", "wt"); 		fprintf(fp, "\r\n%d", 0); 		fclose(fp); 	} 	else 	{ 		fclose(fp); 		fp = fopen("flight_num.txt", "a+"); 		if (fp == NULL) 		{ 			perror("fopen"); 			exit(1); 		} 		int i=-1; 		char ch; 		fseek(fp, i, SEEK_END); 		ch=fgetc(fp); 	 		//读到一行的换行符，再开始向文档尾读取数字  		while(ch!='\n') 		{ 			i--; 	        fseek(fp, i, SEEK_END); 	        ch = fgetc(fp); 		} 	     	     	i = 0;     	ch = fgetc(fp);     	     	//从上面找到的换行符的位置，向文档尾读取，把读到的数字放到数组里  	    while (!feof(fp)) 	    { 	        if (ch >= '0' && ch <= '9') 	        { 	            flight_string[i] = ch; 	            i++; 	        } 	        ch = fgetc(fp); 	    }  		//字符数组转换成数字   		flight_num = atoi(flight_string);   		fprintf(fp, "\r\n%d", (flight_num+1)); 		fclose(fp); 		printf("%d\n", flight_num+1); 	} }

user: user-5
content: 引用 3 楼 寒风_弄夜的回复:a+打开可以的 是fseek错了  大小不应该是偏移1个字节  fseek(fp, -sizeof(int), SEEK_END);      #include <stdio.h> int main() {     FILE *fp;     unsigned int flight_num;     unsigned int flag;     char flight_string[20];       fp = fopen("flight_num.txt", "r"); //第一次进入，文件不存在创建文件并写入0.     if (fp == NULL)     {         printf("open error!\n");         fp = fopen("flight_num.txt", "wt");         fprintf(fp, "%d\n\r", 0);         fclose(fp);     }     else     {         fclose(fp);         fp = fopen("flight_num.txt", "a+");         // printf("1th  %d\n",ftell(fp));         fseek(fp, -sizeof(int), SEEK_END);         // printf("2th  %d\n",ftell(fp));         fscanf(fp, "%d", &flight_num);          // printf("3th  %d\n",ftell(fp));         fprintf(fp, "%d\n\r", flight_num+1);          // printf("4th  %d\n",ftell(fp));         fclose(fp);         printf("%d", flight_num);     }     return 0; }  谢谢，原来我理解错楼主的意思了

user: user-0
content: 引用 3 楼 u012725046 的回复:a+打开可以的 是fseek错了  大小不应该是偏移1个字节  fseek(fp, -sizeof(int), SEEK_END);    #include <stdio.h> int main() {     FILE *fp;     unsigned int flight_num;     unsigned int flag;     char flight_string[20];       fp = fopen("flight_num.txt", "r"); //第一次进入，文件不存在创建文件并写入0.     if (fp == NULL)     {         printf("open error!\n");         fp = fopen("flight_num.txt", "wt");         fprintf(fp, "%d\n\r", 0);         fclose(fp);     }     else     {         fclose(fp);         fp = fopen("flight_num.txt", "a+");         // printf("1th  %d\n",ftell(fp));         fseek(fp, -sizeof(int), SEEK_END);         // printf("2th  %d\n",ftell(fp));         fscanf(fp, "%d", &flight_num);          // printf("3th  %d\n",ftell(fp));         fprintf(fp, "%d\n\r", flight_num+1);          // printf("4th  %d\n",ftell(fp));         fclose(fp);         printf("%d", flight_num);     }     return 0; }  谢谢，但是这样只能计数到255，之后就从0开始了，怎么才能一直计数

user: user-5
content: 第一次打开文件成功后再次打开文件的模式用错了(第41行)，应该用写入模式(w+)而不是追加模式(a+)