2013-08-03 3 views
0

Извините за такой простой вопрос, это часть моего задания, и я застрял. Как видите,Замените строку в текстовом файле только fprintf и fscanf

#include <stdio.h> 

int main (void){ 


FILE *menu; 
FILE *update; 
FILE *updatewrite; 
menu = fopen("menu.txt","w"); 

char selection,name[10],updateid,dump ; 
int mealnum,i,j,id,price ; 

start: 

scanf("%c%c",&selection,&dump); 


if (selection =='r'){ 

printf ("Enter the number of meals to be entered\n"); 
scanf("%d",&mealnum); 

    for(i=0;i<mealnum;i++){ 
     printf("Enter the name of me1al\n"); 
     scanf("%s",&name); 
     printf("Enter the ID of meal\n"); 
     scanf("%d",&id); 
     printf("Enter the Price of meal\n"); 
     scanf("%d",&price); 
     fprintf(menu,"%s %d %d\n",name,id,price); 
     } 
     fclose(menu); 
     } 


else if(selection =='u'){ 


update = fopen("menu.txt","r"); 

int count=0; 
while(fscanf(update,"%s %d %d\n",name,&mealnum,&price) != EOF){ 
printf("Update %s %d %d?\n Y to update any other key for next",name,mealnum,price); 
scanf("%c",updateid); 
count++; 
break; 
} 

printf("Enter the new name of meal\n"); 
scanf("%s",name); 
printf("Enter the new ID of meal\n"); 
scanf("%d",&id); 
printf("Enter the new Price of meal\n"); 
scanf("%d",&price); 


fclose(update); 

updatewrite = fopen("/home/mbp/menu.txt","w+"); 

for(j=0;j<count;j++){fscanf(updatewrite,"%s %d %d\n",name,mealnum,price);} //trying to move buffer to proper overwriting location by looping one less times 

fprintf(updatewrite,"%s %d %d\n",name,mealnum,price); 


fclose(updatewrite);} 


else if(selection =='d'){} 
else if(selection =='s'){} 
else if(selection =='b'){} 
else if(selection =='q'){ 
    return 0; 
} 
else{printf ("Not VALID!");} 
goto start; 


return 0; } 

Ничего кроме fscanf, fprintf не принимается.

Спасибо за любую помощь.

EDIT: полный код обновлен, изменение атрибута, необходимо заменить один файл, мне не разрешено использовать второй файл.

+0

Вы можете вставить всю функцию? потому что это на самом деле не имеет никакого смысла. – Jocke

ответ

1

Поскольку у вас уже есть два файла, откройте оба файла одновременно. Когда вы читаете каждую строку из одной, вы либо записываете одни и те же данные в другую, либо новые данные в другую, в зависимости от выбора пользователя.

FILE *update = fopen("menu2.txt", "r"); 
FILE *menu = fopen("/home/mbp/menu.txt","w+"); 

for (...) { 
    fscanf(update, ...); 
    if (user_wants_update()) { 
     get_new_info(...); 
     fprintf(menu, ...); /* print the new info */ 
    } else { 
     fprintf(menu, ...); /* print the old info */ 
    } 
} 

fclose(menu); 
fclose(update); 
+0

Благодарим вас за информацию, но теперь ей нужен только один файл, который читается и записывается – user2647684

+0

Наиболее прямым решением было бы прочитать весь файл в памяти, а затем выписать измененный файл после того, как все изменения будут выполнены копия в памяти. – jxh

0

Проблема «не работает» принесет пользу более подробно, как в как оды он не работает. Вот мой лучший снимок.

Изменение "% С" на "% с"

Код OP смешивает scanf("%s",... с scanf("%c",.... Это проблема, если перед scanf("%c",..., где-то в неопубликованном коде, вы выполнили scanf("%s",... или тому подобное.

scanf("%s",buf) потребляет все ведущие пробельные и затем помещает следующий небелых текст в buf, оставляя «ввод» (\n) во входном буфере. Последующий scanf("%c",... будет читать (\n) и даже не ждать, чтобы вы напечатали что-то вроде y. Изменив «% c» на «% c», это (\n) и дополнительное пустое пространство будет потреблено (и брошено) и , тогда будет сканироваться ваш y.

Далее рассмотрите возможность проверки возвращаемого значения scanf() и fscanf(). Он поможет вам отладить ваш код.

+0

Спасибо за большой улов, я этого не знал. Но, к сожалению, еще больше проблем исправить. Соответствует ли "" "\ n" или мне нужно "\ n" для них? – user2647684

+0

В 'scanf()', '' сканирует 0 или более белых пробелов. '\ n' сканирует 0 или более белых пробелов. Белое пространство сканирует 0 или более белых пробелов. Чтобы явно сканировать '\ n', используйте'% [\ n] '. Используйте '% * [\ n]', если вы не хотите сохранять результат в 'char *'. – chux

0

Вам нужно будет сделать больше, чем сканировать и распечатать. вот некоторые псевдо-код для вас:

read in line from file 1 
check if line needs modification 
if so 
    modify line 
write line to file 2 

Вот простой пример программы

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    FILE *f1 = fopen("1.txt", "r"); 
    FILE *f2 = fopen("2.txt", "w"); 
    char line[50]; 

    while (fscanf(f1, "%s", line) != EOF) 
    { 
     if (strcmp(line, "replaceme") == 0) 
     { 
      strcpy(line, "replaced"); 
     } 
     fprintf(f2, "%s", line); 
    } 
    fflush(f2); 
    fclose(f1); 
    fclose(f2); 
} 
+0

Это вызов, делая это только с fscanf fprintf – user2647684

0

Может быть, это может работать. Я исправил две ошибки о вашем коде.

update = fopen("menu2.txt","r");// you open a FILE and give the fileid to updata 

for(j=0;j<kk;j++) { 
    fscanf(update,"%s %d %d\n",name,&mealnum,&price); 
    //so you have a file ,already writed format things. 
    printf("Update %s %d %d?\n Y to update any other key for next",name,mealnum,price); 
    scanf("%c\n",&updateid); 
    //I think it's better use "%c\n", then you can know it not stay in buffer. 
    if(updateid == 'Y') //as we print, 'Y' to update .. 
     break;//   if you can not use goto , don't use.//goto out; 
} 
//out: 
// I believe you already declare all those values. 
printf("Enter the name of meal\n"); 
scanf("%s",&name); 
printf("Enter the ID of meal\n"); 
scanf("%d",&id); 
printf("Enter the Price of meal\n"); 
scanf("%d",&price); 

fclose(update);// close the (FILE *) update. In fact, I think here is you mistake. 

menu = fopen("/home/mbp/menu.txt","w+");//menu is used just now.  

for(d=0;d<j-1;d++) { 
    // fscanf(menu,"%s %d %d\n",name,mealnum,price); 
    //here ,you overwrite you values. All you input is missing; Here is another mistake. 
    int mealnum1,price1; 
    char name1[10];//I don't know the size... :) 
     fscanf(menu, %s %d %d\n",&name1,&mealnum1,&price1); 
} 

fprintf(menu,"%s %d %d\n",name,mealnum,price); 
+0

Спасибо за указание ошибок. Они, конечно, приблизили меня. – user2647684

Смежные вопросы