/ / Назва файлу в операторі fopen - c

Назва файлу в операторі fopen - c

Програма попросить назви файлути хочеш відкрити. Потім вміст буде відображатися на екрані. Це те, що я отримав так далеко, і я знаю це неправильно. Той, що я зберігав у назві змінного файла, повинен бути іменем файла в операторі 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;
}