user-0 提问: C语言文件路径问题

回复:
user: user-0
content: 引用 14 楼 寻开心的回复:函数的局部变量，内存在栈当中，栈是向下增长的 windows系统下， 很多c的编译器当中，分配局部变量的内存地址，是在栈当中顺序分配 pic[10] txt[10] jpg[10]很可能是按照这个顺序向下分配地址 pic读取的时候正常，估计你printf（“%s”， pic）也能正常输出 txt读取的时候，估计你也能正常printf， 但是你输入的txt的字符串最后越界的那个0字符，会跑到pic的第一个字符上去，让pic的路径错了 jpg同理会让txt的字符串错了 txt破坏pic的结果就是，pic的首字符是0， 变成空串， 然后就没有然后了，文件自然打不开  即便有的编译器是反向的分配内存， pic、txt和jpg的顺序和前面想反，但是只要连续存放，那必然还是彼此影响的，结局一样  你可以在把三个文件名全部都输入后，一次把三个字符串打印出来，看看是不是有两个都变成了空串 你之所以，用.\1.jpg成功的，是因为他们短啊，没有破坏其他变量的内存地址  以上纯属虚构，未经测试，自己测试测试吧。 6666666666666666666和你说的一模一样，太神奇了把，前两个真的是空字符串，只要把数组的范围扩大就可以正常运行了虽然现在刚学不太懂内存空间的原理，但是按你说的去理解就完全可以讲得通，真的谢谢谢谢谢谢了

user: user-1
content: 函数的局部变量，内存在栈当中，栈是向下增长的 windows系统下， 很多c的编译器当中，分配局部变量的内存地址，是在栈当中顺序分配 pic[10] txt[10] jpg[10]很可能是按照这个顺序向下分配地址 pic读取的时候正常，估计你printf（“%s”， pic）也能正常输出 txt读取的时候，估计你也能正常printf， 但是你输入的txt的字符串最后越界的那个0字符，会跑到pic的第一个字符上去，让pic的路径错了 jpg同理会让txt的字符串错了 txt破坏pic的结果就是，pic的首字符是0， 变成空串， 然后就没有然后了，文件自然打不开  即便有的编译器是反向的分配内存， pic、txt和jpg的顺序和前面想反，但是只要连续存放，那必然还是彼此影响的，结局一样  你可以在把三个文件名全部都输入后，一次把三个字符串打印出来，看看是不是有两个都变成了空串 你之所以，用.\1.jpg成功的，是因为他们短啊，没有破坏其他变量的内存地址  以上纯属虚构，未经测试，自己测试测试吧。

user: user-0
content: 引用 11 楼 寻开心的回复:分三步调试 1 把文件名放到程序当中写死     char * filenameImage[512] = "z:\\1\\1.jpg";     char * filenameTxt[512] = "z:\\1\\1.txt";     char* filenameComb[512] = "z:\\1\\4.jpg";    确保程序可以正常执行后，再做第二步调试  2 从键盘读取字符串，放到上面的三个数组当中，替代原来写死的内容    键盘读取后，马上就printf输出这个数组， 看看读入和输入的是否完全一致    以验证键盘获取的流程的正确性  3 再用正确读取到文件名数组，继续执行程序，看看是否正常  一般说来，都两步是对的，第三步就不会错！ 这样调试以后的确可以了运行了，但我不太知道我之前错在哪，我再自己调试看看，万分感激大佬，谢谢你呀

user: user-1
content: 你这个就是错的啊， 给文件名保留的数组大小太小了 char pic[10], txt[10], jpg[10];  每个只有10个字符 文件路径很轻松的就超越了 z:\1\1.jpg 数数几个字母， 10个吧， 读入的时候，尾巴自带的那个0放哪儿去了？！ 长度是10的字符串，数组保存的时候，数组长度至少是11 越界的后果会影响其他的变量的内容的

user: user-1
content: 分三步调试 1 把文件名放到程序当中写死     char * filenameImage[512] = "z:\\1\\1.jpg";     char * filenameTxt[512] = "z:\\1\\1.txt";     char* filenameComb[512] = "z:\\1\\4.jpg";    确保程序可以正常执行后，再做第二步调试  2 从键盘读取字符串，放到上面的三个数组当中，替代原来写死的内容    键盘读取后，马上就printf输出这个数组， 看看读入和输入的是否完全一致    以验证键盘获取的流程的正确性  3 再用正确读取到文件名数组，继续执行程序，看看是否正常  一般说来，都两步是对的，第三步就不会错！

user: user-0
content: 引用 9 楼 寻开心的回复:你的程序里面，打开文件的代码发出来看一下，包括读取和处理文件名的部分  #include <stdio.h> #include <stdlib.h>   void main() { 	printf("请输入合成文件的文件名和路径:\n");   	char pic[10], txt[10], jpg[10];   	printf("图片:"); 	scanf("%s",pic);   	printf("文本:"); 	scanf("%s",txt);   	printf("图片:"); 	scanf("%s",jpg);   	FILE *fp_pic, *fp_txt, *fp_jpg;   	fp_pic = fopen(pic,"rb"); 	fp_txt = fopen(txt,"rb"); 	fp_jpg = fopen(jpg,"wb");   	if(NULL == fp_pic) 	{ 		printf("不能打开图片文件%s!\n",pic); 		 		exit(0); 	}   	if(NULL == fp_txt) 	{ 		printf("不能打开文本文件%s!\n",txt);   		exit(0); 	}     	if(NULL == fp_jpg) 	{ 		printf("不能写入文件%s!\n",jpg);   		exit(0); 	}   	char ch;   	while(!feof(fp_pic)) 	{ 		ch = fgetc(fp_pic); 		fputc(ch,fp_jpg); 	} 	fclose(fp_pic);   	while(!feof(fp_txt)) 	{ 		ch = fgetc(fp_txt); 		fputc(ch,fp_jpg); 	} 	fclose(fp_txt);   	system("pause");   	system("pause"); }

user: user-1
content: 你的程序里面，打开文件的代码发出来看一下，包括读取和处理文件名的部分

user: user-0
content: 引用 7 楼 寻开心的回复:双杠变单杠 就这么个事儿啊， 其他的都按照你的图片上那样写就行啦 试了一下还是不行也，我把双杠换成单杠还是一样，我之前用的就是单杠。。。

user: user-1
content: 双杠变单杠 就这么个事儿啊， 其他的都按照你的图片上那样写就行啦

user: user-0
content: 引用 5 楼 寻开心的回复:代码当中 的字符串里面是： "D:\\2\\abc.jpg" 这样写， 因为\在字符串当中是转义字符，写成双杠实际存储的字符串里面的依然是单杠 双杠只是它的表达方式而已。你可以把这个双杠的字符串printf出去看看， 结果输出的是单杠  你从键盘输入的时候， 不是代码里面的样式，而是真正的路径， windows系统里面，你如何访问这个路径就如何输入， 都是单杠的 大佬那请问像我图片那样的，1.jpg和2.zip都在一个文件夹1里面，我应该怎么在运行框里输入， 图片路径: 文件路径: 合成文件路径: 能帮我分别对应的写出来吗？ 万分感激，我打上去试试然后再自己理解可以不？

user: user-1
content: 代码当中 的字符串里面是： "D:\\2\\abc.jpg" 这样写， 因为\在字符串当中是转义字符，写成双杠实际存储的字符串里面的依然是单杠 双杠只是它的表达方式而已。你可以把这个双杠的字符串printf出去看看， 结果输出的是单杠  你从键盘输入的时候， 不是代码里面的样式，而是真正的路径， windows系统里面，你如何访问这个路径就如何输入， 都是单杠的

user: user-1
content: d:\2\abc.jpg  d:/2/abc.jpg 这两种均可

user: user-1
content: 双反斜杠，那是在程序代码的字符串里面写 从键盘读取的时候，用不到，单反斜杠或者是单斜杠均可

user: user-0
content: 引用 1 楼 m0_46078443的回复:主要是不知道如何写例如目标文件abc.jpg在d盘中的名称为2的文件夹中我该怎么写路径呢？是不是 D:\\2\\abc.jpg呢？ 求大佬们帮帮小白吧万分感激

user: user-0
content: 主要是不知道如何写例如目标文件abc.jpg在d盘中的名称为2的文件夹中我该怎么写路径呢？是不是 D:\\2\\abc.jpg呢？