Программа ввода/вывода C не работает

Я недавно начал изучать C, однако, я пишу небольшой пример/учебный фрагмент кода, и он показывает ошибки. Я использую дескриптор файла, и некоторые флаги в команде «открыть» не работают, даже если кажется, что я включил правильные файлы заголовков. Вероятно, это простая проблема, которую я проглядел.

Проблема возникает, когда «S_IRUSR» и «S_IWUSR» кажутся неопределенными. Я больше не писал код после этого, поэтому я опубликую все, что у меня есть.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>

void usage(char *prog_name, char *filename)
{
    printf("Usage: %s <data to add to %s>\n", prog_name, filename);
    exit(0);
}

void fatal(char *);
void *ec_malloc(unsigned int);

int main(int argc, char *argv[])
{
    int fd; //file descriptor
    char *buffer, *datafile;

    buffer = (char *) ec_malloc(100);
    datafile = (char *)ec_malloc(20);
    strcpy(datafile, "/tmp/notes");

    if (argc > 2)
        usage(argv[0], datafile);

    strcpy(buffer, argv[1]);

    printf("[DEBUG] buffer\t @ %p: \'%s\'\n", buffer, buffer);
    printf("[DEBUG] datafile\t @ %p: \'%s\'\n", datafile, datafile);

    strncat(buffer, "\n", 1);

    //opening file - this line of code is causing the problem.
    fd = open(datafile, O_WRONLY |O_CREAT | O_APPEND, S_IRUSR|S_IWUSR) 
}

void fatal(char *message)
{
    char error_message[100];

    strcpy(error_message, "[!!] Fatal Error ");
    strncat(error_message, message, 83);
    perror(error_message);
    exit(-1);
}

void *ec_malloc(unsigned int size)
{
    void *ptr;
    ptr = malloc(size);
    if (ptr == NULL)
        fatal("in ec_malloc() on memory allocation");
    return ptr;
}

Как я уже сказал, я не верю, что там есть какие-то опечатки, и, насколько мне известно, там правильные заголовки, но поправьте меня, если я ошибаюсь. Спасибо за любую помощь.


person Daniel Baron    schedule 22.02.2015    source источник
comment
Я не думаю, что там есть опечатки - ну, для начала есть S_IWSUR.   -  person Crowman    schedule 22.02.2015


Ответы (2)


Вы забыли включить stdio.h, опечатку в S_IWUSR и забыли точку с запятой.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>

void usage(char *prog_name, char *filename)
{
printf("Usage: %s <data to add to %s>\n", prog_name, filename);
exit(0);
}

void fatal(char *);
void *ec_malloc(unsigned int);

int main(int argc, char *argv[])
{
int fd; //file descriptor
char *buffer, *datafile;

buffer = (char *) ec_malloc(100);
datafile = (char *)ec_malloc(20);
strcpy(datafile, "/tmp/notes");

if (argc > 2)
    usage(argv[0], datafile);

strcpy(buffer, argv[1]);

printf("[DEBUG] buffer\t @ %p: \'%s\'\n", buffer, buffer);
printf("[DEBUG] datafile\t @ %p: \'%s\'\n", datafile, datafile);

strncat(buffer, "\n", 1);

//opening file - this line of code is causing the problem.
    fd = open(datafile, O_WRONLY |O_CREAT | O_APPEND, S_IRUSR|S_IWUSR);
   }

    void fatal(char *message)
    {
    char error_message[100];

strcpy(error_message, "[!!] Fatal Error ");
strncat(error_message, message, 83);
perror(error_message);
exit(-1);
}

void *ec_malloc(unsigned int size)
{
void *ptr;
ptr = malloc(size);
if (ptr == NULL)
    fatal("in ec_malloc() on memory allocation");
return ptr;
}
person Mark Nicolle    schedule 22.02.2015
comment
смотри мой ответ ниже :D - person yan bellavance; 25.06.2017

Вообще говоря, очень полезно включать именно те сообщения, которые сообщает вам ваш компилятор.

В этом случае мой компилятор сообщит:

cc     foo.c   -o foo
foo.c:8:5: warning: implicitly declaring library function 'printf' with type 'int (const char *, ...)'
    printf("Usage: %s <data to add to %s>\n", prog_name, filename);
    ^
foo.c:8:5: note: please include the header <stdio.h> or explicitly provide a declaration for 'printf'
foo.c:35:63: error: use of undeclared identifier 'S_IWSUR'
    fd = open(datafile, O_WRONLY |O_CREAT | O_APPEND, S_IRUSR|S_IWSUR) 
                                                              ^
foo.c:44:5: warning: implicit declaration of function 'perror' is invalid in C99 [-Wimplicit-function-declaration]
    perror(error_message);
    ^
2 warnings and 1 error generated.

Читая это, мы можем найти две ошибки:

  1. Вам нужно включить stdio.h для printf().
  2. S_IWSUR написано с ошибкой. Должно быть S_IWUSR.
person Bill Lynch    schedule 22.02.2015
comment
Он не скопировался должным образом, я включил все эти вещи, но он по-прежнему не работает. Я использую компилятор C/C++ с Visual Basic, и он говорит, что два флага не определены. - person Daniel Baron; 23.02.2015
comment
@DanielBaron: Можете ли вы указать точные сообщения об ошибках, которые вы получаете в своем вопросе? То есть вы можете его скопировать (или сделать скриншот) и прямо слово в слово скопировать в свой вопрос? - person Bill Lynch; 23.02.2015
comment
'ошибка C2065: 'S_IRUSR': необъявленный идентификатор' и 'ошибка C2065: 'S_IWUSR': необъявленный идентификатор' и это предупреждение 'предупреждение C4013: 'open' undefined, предполагая, что extern возвращает int' - person Daniel Baron; 23.02.2015
comment
@DanielBaron: Какой у вас компилятор (включая версию)? Предположительно это какая-то версия визуальной студии? - person Bill Lynch; 23.02.2015
comment
Mircrosoft Visual Studio Express 2013 для рабочего стола Windows. Версия 12.0.21005.1 REL и Microsoft .NET Framework. Версия 4.5.51209 - person Daniel Baron; 23.02.2015
comment
Кроме того, не могли бы вы опубликовать полный вывод препроцессора для этого файла? stackoverflow.com/questions/8978997/ Публикация на gist.github.com Было бы хорошо, как бы встроено в вопрос. - person Bill Lynch; 23.02.2015
comment
я думаю, что у меня есть предварительно обработанный файл, но он огромный, около 13 000 строк, большая часть из которых пустое место - person Daniel Baron; 23.02.2015
comment
@DanielBaron: Ага. Это то, что я ожидал. И я хотел бы иметь возможность увидеть все это. - person Bill Lynch; 23.02.2015