Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Переключение имен файла


Автор: BrookBond 30.3.2013, 21:51
Знатоки подскажите пожалуйста, как изменять имя файла, чтобы прога открывала нужный мне файл? 
Чтоб я мог выбирать название файла. Я видимо с указателями путаюсь ((
Давно с этой проблемой столкнулся и никак не могу решить, гуглить не помогает
#include <iostream>

int main()
{ FILE *f1;
char stroka[100]; 
int N=0;
int time;
char *fname;

scanf("%d",&time);
switch(time)
{
case1: *fname = "1.txt";break;
case2: *fname = "2.txt"; break;
case3: *fname1 = "3.txt"; break;

default : printf("\nError name of fail");
} 
printf("\ntime=%d fname=%s",time,fname); 

if((f1=fopen(fname,"r"))==NULL); {printf("\nError open %s fail",fname);}
while(!feof(f1))
{fscanf(f1,"%s\n,",& stroka);N++;}
return 0; 
}

Автор: ChihPih 30.3.2013, 22:00
А разве нелья вместо привязки номера к имени, сразу имя файла считать с консоли, а потом открывать его?

Добавлено @ 22:02
Цитата(BrookBond @  31.3.2013,  00:51 Найти цитируемый пост)
case1: *fname = "1.txt";break;

В Си/Си++ с указателями на строки так не работают, для работы со строками в Си, например, для копирования строки в массив типа char используют функцию strcpy, а в Си++ проще юзать класс string.

Автор: Crafty 30.3.2013, 22:13
Как вариант можно так сделать, но вообще наверное проще имя файла считывать
Код

char *fileNames[] = {"1.txt",
                     "2.txt",
                     "3.txt"};
switch(time)
{
    case 1: fname = fileNames[0];break;
    case 2: fname = fileNames[1]; break;
    case 3: fname = fileNames[2]; break;

    default : printf("\nError name of fail");
} 

Автор: BrookBond 30.3.2013, 22:34
С консоли сразу имя не проще, это я привел упращенный вариант проги, на самом деле она большая. И если решить задачу с переключением, то всебудет Ок. Интересно почему переключатель не работает, даже так 
#include <iostream>
#include <stdio.h>
  #include <conio.h>
  #include <ctype.h>
  #include <math.h>
 #include <stdlib.h>
#include <string.h>
   int main()
  { FILE *f1;
    char stroka[100];   
    int N=0;
    int time;
    
    scanf("%d",&time);
    char fname[20];
    
    
    
    
         switch(time)
         {
         case1: sprintf (fname, "GMKN_1.txt");break;
         case30: sprintf (fname, "GMKN_30.txt");break;
        // case3: *fname1 = "3.txt"; break;
       
         default : printf("\nError name of fail");
         } 
         printf("\ntime=%d  fname=%s",time,fname); 
               
        if((f1=fopen(fname,"r"))==NULL); {printf("\nError open %s fail",fname);}
        while(!feof(f1))
                        {fscanf(f1,"%s\n,",& stroka);N++; printf("\n%d",N);}
                        
                        fclose(f1);
 getch ();            
    return 0;         
                       }                 

Автор: Crafty 30.3.2013, 22:42
Цитата(BrookBond @  30.3.2013,  22:34 Найти цитируемый пост)
Интересно почему переключатель не работает, даже так 

пробел между case и 1 у тебя есть?
Код

case 1: sprintf (fname, "GMKN_1.txt");break; 


PS  используй тег код

Автор: BrookBond 30.3.2013, 22:42
Цитата(Crafty @ 30.3.2013,  22:13)
Как вариант можно так сделать, но вообще наверное проще имя файла считывать
Код

char *fileNames[] = {"1.txt",
                     "2.txt",
                     "3.txt"};
switch(time)
{
    case 1: fname = fileNames[0];break;
    case 2: fname = fileNames[1]; break;
    case 3: fname = fileNames[2]; break;

    default : printf("\nError name of fail");
} 

Благодарю, очень выручили))))))    smile 

Автор: volatile 30.3.2013, 23:39
там вообще свитч не нужен. у вас имена же в массиве.

Код

if (time < size_of_array)
   fname = fileNames[time];
else
   // Error ...


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)