Как правильно использовать функцию fscanf в C? - PullRequest
0 голосов
/ 24 февраля 2019

Я учусь работать с файлами в C. До сих пор я мог писать (создавать) текстовые файлы, используя функцию fopen + fprintf, но я не понимал, как работает параметр чтения и записи.

Всякий раз, когдаЯ использую +, w + или r +, моя программа только пишет информацию, но не читает ее.Я должен закрыть файл и снова открыть его в режиме только для чтения.Следующий код объясняет лучше:

Этот код не работает для меня:

#include<stdio.h>
#include<stdlib.h>

int main(void){

    FILE * myfile = nullptr;

    myfile = fopen("./program.txt", "a+"); // I also tried w+ and r+

    int num1 = 4;
    int num2 = 0;

    fprintf(myfile, "%d", num1);
    fscanf(myfile, "%d", &num2);  // the atribution does not occur
                                  // num2 keeps previous value
    printf("%d", num2);
    fclose(myfile);

return (0);}

Это прекрасно работает:

#include<stdio.h>
#include<stdlib.h>

int main(void){

    FILE * myfile = nullptr;

    myfile = fopen("./program.txt", "w");

    int num1 = 4;
    int num2 = 0;

    fprintf(myfile, "%d", num1);
    fclose(myfile);                //close the file!

    myfile = fopen("./program.txt", "r"); // reopen as read only!
    fscanf(myfile, "%d", &num2);
    printf("%d", num2);
    fclose(myfile);

return (0);}

Есть лилюбой способ работать с файлом (читать и изменять его) без необходимости каждый раз закрывать его?

1 Ответ

0 голосов
/ 24 февраля 2019

Когда вы хотите прочитать обратно в том, что вы только что написали, вы должны переместить файловый курсор обратно в начало (или в любую позицию, с которой вы хотите начать чтение).Это делается с помощью fseek.

#include<stdio.h>
#include<stdlib.h>

int main(void) {
    FILE * myfile = NULL;

    myfile = fopen("./program.txt", "a+"); // I also tried w+ and r+

    int num1 = 4;
    int num2 = 0;

    fprintf(myfile, "%d", num1);
    fseek(myfile, 0, SEEK_SET);
    fscanf(myfile, "%d", &num2);  // the atribution does not occur
                                  // num2 keeps previous value
    printf("%d", num2);
    fclose(myfile);
}

Живой пример на Wandbox

...