Програма попросить назви файлути хочеш відкрити. Потім вміст буде відображатися на екрані. Це те, що я отримав так далеко, і я знаю це неправильно. Той, що я зберігав у назві змінного файла, повинен бути іменем файла в операторі fopen.
#include<stdio.h>
main()
{
FILE *fp;
char filename[20];
char c;
clrscr();
printf("ENTER FILE NAME: ");
scanf("%s",&filename);
while(!feof(fp))
{
fgetc(fp=fopen("filename","r"));
while(!feof(fp))
{
fscanf(fp,"%c",&c);
printf("%c",c);
}
}
fclose(fp);
getch();
}
Чи існують які-небудь методи / функції, які є одним ящо зберігається в змінному імені файлу, буде в операторі fopen? Я знаю, що в цій програмі є щось небажане. Будемо із задоволенням оцінити, чи зможете ви допомогти мені в цьому.
Відповіді:
1 для відповіді № 1Ви загорнули ім'я файлу в лапках, тому шукає файл з назвою filename
і не все, що знаходиться в змінній вашого імені файлу. Спробуйте:
fp=fopen(filename,"r");
fgetc(fp);
2 для відповіді № 2
По-перше, це твердження неправильне:
scanf("%s",&filename);
Те, що ви робите, проходить а char **
(технічно, a char (*)[20]
) до scanf
, але замість цього ви хочете просто а char *
, тому ви можете позбутися &
, так:
scanf("%s", filename);
Також зауважте, що scanf
не має можливості знати, наскільки велика filename
є (у цьому випадку всього 20 символів), так що якщо вивведіть занадто велике ім'я файлу, програма збій (або гірша). Крім того, якщо у назві файлу є будь-які пробіли, ви отримаєте тільки першу частину імені файлу, а замість цього можете використовувати fgets
подобається так:
fgets(filename, 20, stdin);
Просто попереджайте, що це також буде читати нову лінію filename
, тому вам потрібно використовувати strlen
видалити його.
По-друге, вираз fopen("filename","r")
використовує рядок "filename"
як ім'я файлу. Просто позбуйтеся котирувань, щоб використовувати змінну.
Також ви зателефонуєте feof(fp)
у вашому зовнішньому while
цикл без фактичної ініціалізації fp
. Не робіть цього. Замість цього, ви повинні мати fp = fopen(...)
бути в окремому if
заява, щоб переконатися, що він відкритий правильно:
if (fp = fopen(...))
{
// TODO: read file here
}
else
{
// file could not be opened properly!
}
Нарешті, ви ніколи не призначаєте значення, що повертається fgetc
до вашої локальної змінної c
(який, до речі, повинен бути int
розрізняти EOF
від інших персонажів).
0 для відповіді № 3
#include <stdio.h>
int main(void){
FILE *fp;
char filename[20];
int c;
clrscr();
printf("ENTER FILE NAME: ");
scanf("%19s", filename);//You cannot use spaces in the file name.
if(fp=fopen(filename,"r")){
while(EOF!=(c=fgetc(fp))){
printf("%c", c);
}
fclose(fp);
}
getch();
return 0;
}