Пытаетесь понять файловые указатели? - PullRequest
0 голосов
/ 10 декабря 2011

Основное описание проблемы ниже, где это происходит.Но просто я не могу понять, почему я получаю сообщения об ошибках после запроса

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 ]

3 голосов
/ 10 декабря 2011

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

outf=fopen(outfilename,"w");  /* Note the "w". */

Кроме того, scanf () принимает указатели на переменные, а не на их значения, поэтому, если вы напишите scanf("%c", yn);, вы дадите scanf символ 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. */

Обратите внимание, что после if блок else не требуется, поскольку exit() немедленно завершает программу.

Кроме того, не существует такой вещи, как «указатель на файл». FILE - это просто структура, представляющая открытый файл.

0 голосов
/ 10 декабря 2011

Вы должны передать адрес yn функции scanf.

scanf("%c", &yn);

0 голосов
/ 10 декабря 2011

http://www.cplusplus.com/reference/clibrary/cstdio/fopen/

Вы открываете выходной файл с флагом чтения. Попробуйте изменить его на "w".

outf=fopen(outfilename,"w");

Хотя стоит отметить, что запись в файл, открытый с помощью «w», приведет к удалению старого файла. используйте «a» для добавления в файл.

...