Использование fopen s в C
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.