user-0 提问: 莫名其妙的问题，急求帮助

回复:
user: user-0
content: 而之后的FPrt(FILE * &Data, CT * TP)函数里传送的是错误指针，但是实际上文件正确建立，并且无报错，文件指针顺利传送回去可以使用。

user: user-0
content: E:ClientData.txt 到打开文件时fopen函数内部参数的值，出奇了，竟然顺利打开不报错

user: user-1
content: 引用 12 楼 RACHETIME 的回复:在赋值字符串之前和全局初始化一致为0000.......  当然看之后了，另外你好奇可以跟到fopen函数内，看怎么执行的

user: user-0
content: 在赋值字符串之前和全局初始化一致为0000.......

user: user-1
content: 引用 10 楼 RACHETIME 的回复:。。。没办法我这人太钻牛角尖了。。数组我初始化为0，但是模块直接在空指针的情况下进入，文件不存在，换成其他盘符就不行了，唯独E盘可以，这是编译器的问题还是windows7的bug呢，的确值得研究啊。  你一步一步跟踪，看路径字符串里存的是什么

user: user-0
content: 。。。没办法我这人太钻牛角尖了。。数组我初始化为0，但是模块直接在空指针的情况下进入，文件不存在，换成其他盘符就不行了，唯独E盘可以，这是编译器的问题还是windows7的bug呢，的确值得研究啊。

user: user-0
content: 之前那段代码在之下这个运行之后就直接进入了  #define OK 1//状态宏 #define ERROR  0//状态宏 typedef int Status;//状态宏  typedef struct Client//单个客户的链表结构体节点 { 	char PhoneNumber[12];//手机号码 	char Price[6];//价格 	int Time;//相对时间 	struct Client * next;//存放下一结点地址 }CT;//重命名 typedef struct AssList//用于解决单链表下表问题快速排序存放链表地址的结构体，动态分配节点个后进行快排 { 	struct Client * AssClient;//存放单链表结构体 }AL;  //功能函数 Status Cybernetics(void);//菜单OK CT * LoadData(FILE * &Data);//第一次载入按时间排序的客户文件信息OK CT * AddToData(FILE * &Data, CT * Server);//追加文件OK CT * InsertInf(FILE * &Data, CT * Server);//手动插入数据多选择OK CT * DeleteTHP(FILE * &Data, CT * Server);//删除最高价，对文件修改OK void UriResult(CT * Server, int Amount);//根据产品数量决定竞价结果OK void SerTop(CT * Server);//查询当前最高价格OK  //工具函数 CT * InsertSort(AL * &AssList, FILE * &Data, int Low, int High, CT *Key);//对插入信息进行折半排序插入OK CT * FastSort(AL * &AssList, FILE * &Data, int Time);//对文件载入快速排序OK Status AssFS(AL * &AssList, int Left, int Right);//快速排序主体函数OK void GiAss(AL * &AssList, CT * TP);//给数组AssList赋值 void CloList(AL * &AssList, int Count);//连接链表 Status CompChP(CT * &AssListP, CT * BssListP);////比较函数隐含条件 > 号大于返回1，小于-1，相等时间大 0 、 小 2 OK void FPrt(FILE * &Data, CT * TP);//文件写入 int ROrt(FILE * &Data, CT * TP, int Time);//文件读出 void Color(int Optional);//1红，2绿，3黄，4蓝Color();  char  FileServer[100] = {0}; //用于存放绝对路径，路径以后可以随时使用方便  //功能函数 Status Cybernetics(void)////菜单 { 	FILE * Data = NULL;//文件复用指针 	CT * Server = NULL;//数据操作单链表 	int Optional;//选项 	int Amount = 0;  	while(1) 	{ 		Color(2); 		puts("\n\n\n\t============================================================"); 		Color(3); 		puts("\t 1. 第一次载入按时间排序的客户文件信息.\t2. 手动添加用户信息\n"); 		puts("\t 3. 删除最高价，对文件修改.            \t4. 追加文件\n"); 		puts("\t 0. 退出系统                           \t5. 统计得奖名单.\n"); 		puts("\t 6. 查询当前报价."); 		Color(2); 		puts("\t============================================================"); 		Color(3); 		printf("\t输入选项(0 ~ 1):"); 		Color(1); 		scanf("%d", &Optional);//输入选项 		Color(3); 		switch(Optional) 		{ 		case 0: 			if(Data != NULL) fclose(Data);//退出系统前关闭文件,至少打开过一次 			exit(0);//退出系统  			break; 		case 1: 			if(Data == NULL)//防止重复录入文件 			{ 				if(Server = LoadData(Data))//判断是否录入成功 				{ 					puts("\t录入成功."); 					Color(4); 					printf("\t当前最高价为:%s %s\n", Server->PhoneNumber, Server->Price); 					Color(3); 				} 				else 				{ 					puts("\t录入失败."); 				} 			} 			else 			{ 				puts("\t已经录入文件，是否追加."); 				AddToData(Data, Server); 			} 			break;//第一次录入文件后返回操作单链表 		case 2: 			Server = InsertInf(Data, Server); 			break; 		case 3: 			if(Server != NULL) 			{ 				Server = DeleteTHP(Data, Server);//删除最高价，对文件修改 			} 			else 			{ 				puts("\t未录入数据，请先录入."); 			} 			break; 		case 4: 			if(Server != NULL) 			{ 				Server = AddToData(Data,Server); 			} 			else 			{ 				puts("\t还未录入数据，请录入数据."); 			} 			break; 		case 5: 			if(Server != NULL) 			{ 				printf("\t请输入产品量:");                 Color(1); 				scanf("%d", &Amount); 				Color(3); 				UriResult(Server, Amount); 			} 			else 			{ 				puts("\t还未录入数据请先录入数据!"); 			} 			break; 		case 6: 			SerTop(Server); 			break; 		default: 			printf("\t您的输入有误,重新输入!");  		}  		getchar();//用与使屏幕停顿，防止直接清屏 		getchar(); 		system("CLS");//清屏 	}  }

user: user-1
content: 引用 6 楼 RACHETIME 的回复:puts("\t当前生成文件保存于 E:\ClientData.txt 中\n");  strcpy(FileServer, "E:\ClientData.txt");  Data = fopen(FileServer, "w+");//以清除全部的方式打开文件 FPrt(Data, Server);  Color(4);  这里我是为了防止程序第一次录入文件为空导致出错直接生成文件，但是这里竟然转义字符问题失效，而且仅限于我的E盘符。文件结构体指针之前的指针为空，这是让我感觉莫名其妙的地方，什么时候语法也可以变得这么模棱两可了。  字符串中要 \\ 才表示实际的 \  ， 不要浪费精力去研究错误，错误可能带来各种结果，包括你希望的与不希望的 如果想分析原因，可以单步调试，观察变量里存成什么了，不过这种研究没意义，楼主记得要用两个就行了

user: user-0
content: 补充一下编译环境VS2010，论坛没法发送附件所以完整程序没法发了大概有1000行左右一发浏览器就挂了。

user: user-0
content: puts("\t当前生成文件保存于 E:\ClientData.txt 中\n");  strcpy(FileServer, "E:\ClientData.txt");  Data = fopen(FileServer, "w+");//以清除全部的方式打开文件 FPrt(Data, Server);  Color(4);  这里我是为了防止程序第一次录入文件为空导致出错直接生成文件，但是这里竟然转义字符问题失效，而且仅限于我的E盘符。文件结构体指针之前的指针为空，这是让我感觉莫名其妙的地方，什么时候语法也可以变得这么模棱两可了。

user: user-0
content: 嗯，的确是转义字符问题。但是我再上传另一个程序吧，这个里面有段代码竟然在无文件存在情况下 \  也可以通过。 CT * InsertInf(FILE * &Data, CT * Server)//手动插入数据多选择 { 	if(Server) 	{ 		Color(4); 		printf("\n\t当前最高报价为:%s %s\n", Server->PhoneNumber, Server->Price); 		Color(3); 		int Optional = 0; 		AL * AssList;//用于存放排序连续内存首地址 		CT * TP;//链表辅助指针 		int Count;//用于计算链表长度以确定辅助内存空间  		while(1) 		{ 			printf("\t是否插入多条信息(>=2), 输入1多条，2单条,0退出:"); 			Color(1); 			scanf("%d", &Optional); 			Color(3); 			if(Optional == 1) 			{ 				puts("\t输入-1 -1 则停止录入."); 				while(1) 				{ 					TP = Server; 					for(Count=1; TP->next != NULL; Count++) TP = TP->next;//计算节点个数，并且将TP移动到最后一个节点 					TP = (CT *)malloc(sizeof(CT)); 					TP->next = NULL; 					TP->Time = Count;//加入相对时间 					getchar(); 					printf("\t请输入手机 号码 价格:"); 					Color(1); 					scanf("%s%s", TP->PhoneNumber, TP->Price); 					Color(3); 					if(strcmp(TP->PhoneNumber, "-1") != 0) 					{ 						AssList = (AL *)malloc(sizeof(AL) * Count); 						GiAss(AssList, Server); 						Server = InsertSort(AssList, Data, 0, Count, TP);//折半插入 ///可用ftell函数代替一下操作  						fclose(Data); 						Data = fopen(FileServer, "w+");//以清除全部的方式打开文件 						FPrt(Data, Server); 						free(AssList); 					} 					else if(strcmp(TP->PhoneNumber, "-1") == 0) 					{ 						free(TP); 						break; 					} 				} 				Color(4); 				printf("\t当前最高报价为:%s %s\n", Server->PhoneNumber, Server->Price); 				Color(3); 				rewind(Data); 				return Server; 			} 			else if(Optional == 2) 			{ 				TP = Server; 				for(Count=1; TP->next != NULL; Count++) TP = TP->next;//计算节点个数，并且将TP移动到最后一个节点 				TP = (CT *)malloc(sizeof(CT)); 				TP->next = NULL; 				TP->Time = Count;//加入相对时间 				getchar(); 				printf("\t请输入手机 号码 价格:"); 				Color(1); 				scanf("%s%s", TP->PhoneNumber, TP->Price); 				Color(3); 				AssList = (AL *)malloc(sizeof(AL) * Count); 				GiAss(AssList, Server); 				Server = InsertSort(AssList, Data, 0, Count-1, TP);//折半插入 ///可用ftell函数代替一下操作  				fclose(Data); 				Data = fopen(FileServer, "w+");//以清除全部的方式打开文件 				FPrt(Data, Server); 				Color(4); 				printf("\n\t当前最高报价为:%s %s\n", Server->PhoneNumber, Server->Price);  				rewind(Data); 				free(AssList); 				return Server; 			} 			else if(Optional == 0) 			{ 				return Server; 			} 			else 			{ 				puts("\t您的输入有误重新输入."); 			} 		} 	} 	else 	{ 		while(1) 		{ 			int Optional; 			printf("\t您的录入信息为空，是否开始手动录入，1是，0否:"); 			Color(1); 			scanf("%d", &Optional); 			Color(3); 			if(Optional == 1) 			{ 				AL * AssList;//用于存放排序连续内存首地址 				CT * TP, * TPN;//链表辅助指针 				int Count = 0;//用于计算链表长度以确定辅助内存空间  				puts("\t输入-1 -1 则停止录入."); 				Server = (CT *)malloc(sizeof(CT)); 				TP = Server; 				strcpy(TP->PhoneNumber, "0"); 				while(strcmp(TP->PhoneNumber, "-1") != 0) 				{ 					printf("\t请输入手机 号码 价格:"); 					Color(1); 					scanf("%s%s", TP->PhoneNumber, TP->Price); 					Color(3); 					TP->Time = Count; 					TP->next = NULL;  					if(strcmp(TP->PhoneNumber, "-1") != 0) 					{ 						TPN = (CT *)malloc(sizeof(CT)); 						TP->next = TPN; 						TPN = TP; 						TP = TP->next; 						Count++; 					} 				} 				if(Count > 0) 				{ 					TPN->next = NULL; 					free(TP);  					AssList = (AL *)malloc(sizeof(AL) * Count); 					GiAss(AssList, Server); 					Server = FastSort(AssList, Data, Count-1);  				 puts("\t当前生成文件保存于 E:\ClientData.txt 中\n"); 					strcpy(FileServer, "E:\ClientData.txt"); 					Data = fopen(FileServer, "w+");//以清除全部的方式打开文件 					FPrt(Data, Server); 					Color(4); 					printf("\n\t当前最高报价为:%s %s\n", Server->PhoneNumber, Server->Price); 					Color(3); 					free(AssList); 					rewind(Data); 					return Server; 				} 				else 				{ 					free(Server); 					return NULL; 				} 				return Server; 			} 			else if(Optional == 0) 			{ 				return NULL; 			} 			else 			{ 				puts("您的输入有误重新输入."); 			} 		}  	} }

user: user-1
content: GenList函数放到main上面 要两个\\是因为\是转义字符，两个\\才表示实际的\

user: user-2
content: 楼上两位都说的对着，我自己也试了下，对着。  #include <stdio.h>  #include <time.h> #include <stdlib.h> #include <string.h> //#include"PressTest.h"  FILE * GenList(void);//生成文件 int main(void) { 	FILE * TF; 	TF = GenList(); 	return 0; }   FILE * GenList() { 	char FileS[100]; 	FILE * TF = NULL; 	int ID; 	strcpy(FileS, "D:\\test.txt"); 	TF = fopen(FileS, "w+");  	srand((unsigned)time(NULL)); 	for(ID=0; ID<3000; ID++) 	{ 		fprintf(TF, "%d %d", ID, rand() % 9999); 		if(ID < 2999) fputc('\n', TF); 	} 	rewind(TF); 	return TF; }  （1)strcpy(FileS, "D:\\test.txt");为什么要多一个“\”呢？ （2）函数声明要放在函数调用之前。

user: user-3
content: 很明显，函数作用域问题，把FILE * GenList(void);//生成文件放到main函数上边

user: user-4
content: strcpy(FileS, "D:\\test.txt");