Я делаю упражнение на C.Еорепа функции помещает мусор на пути доступа к файлу
Программы принимает в качестве аргумента имя файла, без расширения, («Р01», или «P02» и так далее.) Программа должна открыть три файла с именем (в случае ввода «p01») «p01_c.txt», «p01_w.txt» и «p01_p.txt». . Я держу путь к файлу до Р01 в строку ruta
«и просто добавить расширение„_c.txt“,„_w.txt“с strcat()
перед открытием файла с fopen(ruta, "rb")
Теперь мои проблемы начинаются:
1) После того, как fopen()
, какая-то фигня появляется в ruta
.
2) Я не могу вырезать строку Обрамление \0
в том месте, где я хочу, чтобы вырезать строку.
Я искал ответ в интернете, но я их не нашел, поэтому я здесь прошу в первый раз.
Вот мой код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
if(argc<2) {
printf("\nNo se ha introducido un fichero válido\n");
return -1;
} else {
char ruta [] = "";
strncat(ruta,argv[0],strlen(argv[0])-14);
strcat(ruta,"knapsack\\"); // knapsack is the folder containing th files
strcat(ruta,argv[1]); // now ruta is: ...\knapsack\p01
FILE * fCapacidad;
strcat(ruta,"_c.txt"); // ruta is: ... \knapsack\p01_c.txt
printf("1- ruta is: %s\n",ruta); // ruta is OK
fCapacidad = fopen(ruta , "rb");
if(fCapacidad == NULL){
fputs ("\nNo se ha introducido un fichero válido de capacidad\n",stderr); exit(1);
}
FILE * fPesos;
printf("2- ruta is: %s\n",ruta); // ruta HAS GARBAGE!!!
ruta[strlen(ruta-6)] = '\0';
printf("3- ruta is: %s\n",ruta); // ruta IS NOT CROPPED!!!
strcat(ruta,"_w.txt");
printf("4- ruta is: %s\n",ruta); //_w.txt is appended to ruta (OK)
fPesos = fopen(ruta, "rb");
выход:
1- ruta is: E:\C Projects\MochilaEnC\bin\Debug\knapsack\p01_c.txt
2- ruta is: E:\C Projh>w\MochilaEnC\bin\Debug\knapsack\p01_c.txt
3- ruta is: E:\C Projh>w\MochilaEnC\bin\Debug\knapsack\p01_c.txt
4- ruta is: E:\C Projh>w\MochilaEnC\bin\Debug\knapsack\p01_c.txt_w.txt
No se ha introducido un fichero vßlido de pesos
В этом контексте, Conflan, проще всего удалить вопрос. Это совершенно нормально, но на самом деле это не освещает кого-либо еще. (Я не думаю, что это вероятно, что кто-то придет и захочет узнать «Если я выделил один байт для строки, а затем использовал 40 байт, что происходит и как это остановить?») Если @ user3121023 хотел отправьте ответ, который, должно быть, произошел к настоящему времени, я думаю. Кроме того, вы можете дождаться, когда он будет переведен на удержание и затем удален. Основной урок - убедиться, что вы знаете, где (и как) вы выделили пространство, которое вы используете. –
Ваша поговорка о том, что у вас есть проблема времени выполнения, тогда вы не опубликовали код, который с готовностью компилируется. На самом деле опубликованный код даже не приближается к компиляции, а тем более чисто компилируется. Пожалуйста, отправьте код, который тщательно компилирует и показывает проблему. – user3629249