Пытаетесь понять файловые указатели?
Основное описание проблемы ниже, где это происходит. Но просто я не могу понять, почему я получаю сообщения об ошибках после запроса
if (outf!=NULL){
printf("Output file already exists, overwrite (y/n):");
scanf("%c",yn);
}
Где outf - указатель на существующий файл. Пожалуйста, прочитайте описание в середине кода.
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
#include <string.h>
int main() {
/* Declare file pointer */
FILE *inf;
FILE *outf;
int linenumber,linecounter=0,linepresent;
char filename[21];
char detail[21];
char linedetail[21];
char outfilename[21];
char letter,yn='y';
int position;
/*INPUT DETAILS Ask user for file name and line number*/
printf("Please enter an input filename and a linenumber: ");
//scan filename to char string and line number to int variable
scanf("%s %i",&filename,&linenumber);
/*OUTPUT DETAILS Ask user for file name, letter & position, etc*/
printf("Please enter an output filename, a letter and a position:");
scanf("%s %c %i",&outfilename,&letter,&position);
/* Open file for reading */
inf=fopen (filename,"r");
outf=fopen(outfilename,"r");
/*check that file exists*/
if (inf!=NULL) {
До здесь все работает отлично! Затем я пытаюсь выяснить, существует ли уже файл outf. Если outf указывает на существующий файл, он выдает "Выходной файл уже существует, перезаписать (y/n):"
ОДНАКО, как только он напечатает это, я получаю сообщение об ошибке открытия окон! Это, вероятно, чрезвычайно ошибочная новичок - я все еще изучаю C. Если такого файла нет, программа завершается нормально и обходит оператор if, все в порядке.
if (outf!=NULL){
printf("Output file already exists, overwrite (y/n):");
scanf("%c",yn);
}
if (yn=='y'){
/*keep reading to end of file*/
while (feof(inf)==0) {
linecounter++;
/*read each line and store the line number in detail[WORDS GO HERE]*/
fscanf (inf,"%s", &detail);
/*If we reach the line selected by the user*/
if (linecounter==linenumber){
strcpy(linedetail,detail);
linepresent=1;
}
}
if (linepresent==0) {
printf("File only contains %i lines",linecounter);
}
} else {
exit(1);
}
} else {
printf("Input file not found");
}
printf("%s",linedetail);
/* close the file */
fclose(inf);
fclose(outf);
return (0);
}
3 ответа
Во-первых, уже упоминавшиеся проблемы: вы открываете выходной файл в режиме чтения. Чтобы открыть его для записи:
outf=fopen(outfilename,"w"); /* Note the "w". */
Кроме того, scanf() принимает указатели на переменные, а не на их значения, поэтому, если вы напишите scanf("%c", yn);
, вы дадите сканф персонажу y
в качестве указателя, что ерунда. Вам нужно сделать это так: scanf("%c", &yn);
,
Однако, даже если вы исправите это, ваша программа не будет делать то, что вы ожидаете. Если файл, который вы пытаетесь открыть для записи, не существует, fopen()
не вернет NULL, он создаст новый файл. Ваш код всегда перезаписывает выходной файл, если он существует. NULL возвращается только если fopen
не удалось открыть / создать файл (например, у вас не было разрешений на это), и вы должны обработать его следующим образом:
outf=fopen(outfilename, "w");
if(outf == NULL) {
perror("Failed to open output file: ");
fclose(inf); /* Don't leave files opened. It's bad form. */
exit(1);
}
/* Open succeeded, do your stuff here. */
Обратите внимание, что нет else
блок нужен после if
, так как exit()
немедленно завершает программу
Также нет такой вещи как "указатель на файл". FILE - это просто структура, представляющая открытый файл.
Вы должны передать адрес yn
в scanf
функция.
scanf("%c", &yn);
http://www.cplusplus.com/reference/clibrary/cstdio/fopen/
Вы открываете выходной файл с флагом чтения. Попробуйте изменить его на "ш".
outf=fopen(outfilename,"w");
Хотя стоит отметить, что запись в файл, открытый с помощью "w", приведет к удалению старого файла. используйте "а" для добавления в файл.