Использование fopen s в C

у меня проблема с программированием на C, особенно с fopen в Visual Studio. Я читал о

5 ответов


вы используете fclose с недопустимым fp значением, даже если Открытие не удалось. Добавить {} вокруг else филиал, по крайней мере.

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


на _s функции-это непортящиеся изобретения Microsoft, которые по большей части дублируют функции, уже существующие под более переносимым именем. Более того, слепо меняется от не -_s вариант функции _s variant обычно делает не исправить что-либо. (Например, молчаливое усечение строки -менее катастрофическими чем clobbering стека, но это все еще плохое поведение, которое может быть эксплуатируемый.)

ваша проблема - которая не зависит от разницы между fopen и fopen_s -- почти наверняка, что вы не удосужившись проверить на наличие ошибок. Вот как проверить на наличие ошибок правильно:

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(int argc, char **argv)
{
    FILE *fp;

    if (argc != 2) {
        fprintf(stderr, "usage: %s filename\n", argv[0]);
        return 2;
    }

    fp = fopen(argv[1], "rb");
    if (!fp) {
        fprintf(stderr, "opening %s: %s\n", argv[1], strerror(errno)); // HERE
        return 1;
    }

    // use 'fp' here...

    return 0;
}

обратите внимание, как линии, обозначенной // HERE печать и точная строка, которая была передана fopen и в результате strerror(errno). Абсолютно необходимо, чтобы вы напечатали оба аргумента и strerror(errno) всякий раз, когда системный вызов завершается ошибкой. (Примечание: Если вы используете один из _s функции, возвращающие код ошибки, а не устанавливающие errno, затем вы должны передать возвращаемое значение в strerror вместо.)

изменить программу, чтобы сделать это, и вы сможете выяснить,почему он не работает.


в Windows косые черты отличаются от Linux, поэтому вы можете использовать C:\File - ... txt вместо C:/File - ... формат txt.


/ / дайте ему шанс, он работает.

#include <stdio.h>
#include <tchar.h>
#include<iostream>
using namespace std;
int main()
{
    int score = 10;
    FILE *fp;
    errno_t err;
    if ((err = fopen_s(&fp, "C:\Users\achea\Desktop\File.txt", "w+")) != 0)
    {
        printf("File was not opened\n");
    }
    else
    {
        fprintf(fp, "Date: %s, Time: %s, Score: %i \n", __DATE__, __TIME__, 
        score);
    }
    fclose(fp);
    return 0;
}

Что касается режима, который вы используете для открытия,

 err = fopen_s(&fp, "C:/File.txt", "rt")

Я никогда не использовал букву T в качестве параметра и не знаю, что это...

но вы открываете с R (чтение) и пытаетесь написать...

попробовать

 err = fopen_s(&fp, "C:/File.txt", "w")

или

 err = fopen_s(&fp, "C:/File.txt", "w+")

кроме того, вам действительно не нужна переменная err. Если вызов fopen завершается неудачно, указатель будет равен NULL.