C: не может записать данные в файл - PullRequest
2 голосов
/ 18 ноября 2010

Я хочу открыть файл, записать в него некоторые данные, поэтому я должен использовать (Fopen) «Я не могу использовать open, потому что мне нужно fopen в некоторых других вещах»

Теперь, если я хочу записать в файл, используя fwrite, я просто не знаю, почему это то, о чем я говорил в моем коде # option1, но если я получаю дескриптор файла и использую обычный метод записи, то все работает нормально, см. # вариант 2 ниже.

Кто-нибудь может помочь мне заставить работать fwrite?

    char file_data[256] // has some values 
    int file_size = strlen(file_data);
    FILE *file;
    file = fopen(MY_FILE_NAME, "w+");


    if(!file){//edited 
           return false;
    }


    #option 1//this is not working 
    fwrite(file_data,1,file_size,file);
    #end of option 1

    #option 2//this works 
    int fd = fileno(file);
    int x = write(fd,file_data,file_size);//
    #end of option 1

EDIT

мои file_data что-то вроде этого

  1. 4 байта зарезервированы для целого числа (обязательно)
  2. 200 байтов зарезервировано для строки (необязательно)

Ответы [ 8 ]

1 голос
/ 18 ноября 2010

буферизованные операции ввода-вывода используют буфер, которым управляет C lib. Ваша «проблема» в том, что fwrite буферизован, что означает, что для записи в файл вам, скорее всего, нужно сбросить его с fflush() или просто закрыть файл.

1 голос
/ 18 ноября 2010

Прежде всего:

if(!file < 0 ){
       return false;
}

file это либо NULL (в случае ошибки), либо нет (в случае успеха) - нет смысла проверять его на 0, так как это указатель (следовательно, без знака).

Ваш вызов fwrite выглядит нормально, но вы должны убедиться, что сумма, которую вы пытаетесь записать, верна (есть ли строка с нулевым символом в конце file_data?).

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

1 голос
/ 18 ноября 2010

Если вы хотите проверить возвращаемое значение fopen (), сделайте так:

if (file == NULL) return false;

, тогда, если вы хотите написать строку, то fputs () предпочтительнее, ИМХО, потому что она лучше взаимодействует сто, что вы пишете, является строкой.

Поскольку, согласно вашему последнему редактированию, вы не пишете строки ASCII, это то, что вы должны кодировать:

#include <stdio.h>

struct String
{
    int size;
    char data[200];
};

int main()
{
    struct String s;

    FILE* file = NULL;
    file = fopen("filename", "wb+");

    memset(&s, '\0', sizeof(s));
    strcpy(s.data, "Hello, world!");
    s.size = strlen(s.data);

    fwrite(&s, 1, sizeof(s), file);

    if (!file) return 1;

    fclose(file);
}
0 голосов
/ 18 ноября 2010

Полагаю, ваш код fwrite не является проблемой.

Когда первый байт в ваших file_data равен \ 0, вы ничего не пишете.Поскольку данные не являются строкой, запишите 256 байтов.Этот код работает:

#include <stdio.h>
#include <string.h>
#define MY_FILE_NAME "sample.bin"
#define SAMPLE_DATA  "Content Content"
int main()
{
    char file_data[256];
    int file_size = sizeof(file_data);

 // fill in some sample data
 memcpy(file_data, SAMPLE_DATA, sizeof(SAMPLE_DATA));

    FILE *file = fopen(MY_FILE_NAME, "w+");
    if (file) {
  fwrite(file_data, 1, file_size, file);
  fclose(file);
    }
}

Видите ли, это ваш fwrite.Я использую sizeof вместо strlen, чтобы определить количество записываемых байтов ...

BR

0 голосов
/ 18 ноября 2010

Вы должны поставить fflush(file); после fwrite, чтобы форсировать запись данных, или вы также можете полностью удалить буфер, выполнив setbuf(file, NULL); после вашего fopen вызова.

0 голосов
/ 18 ноября 2010

fwrite используется для двоичного вывода, поэтому вы должны открыть файл с помощью "wb"

0 голосов
/ 18 ноября 2010

Я думаю, вам нужно либо сделать fclose (файл), либо fflush (файл). потому что fopen буферизует IO, поэтому он не записывает сразу, поэтому, чтобы убедиться, что запись в файл выполнена, вам нужно это сделать.

0 голосов
/ 18 ноября 2010

На первый взгляд кажется, что ошибка в строке №2:

int file_size = strlen(file_data);

Это работает, только если существует конечный нулевой символ. Поэтому file_size должен быть предоставлен, например, как аргумент функции, или вы должны использовать полный размер массива.

Должно работать следующее:

int write_in_my_file(int data_int, const char* data_str)
{
  size_t written;
  FILE* file = fopen(MY_FILE_NAME, "wb+"); /* SuperJulietta */
  if (!file) return false;

  written = fwrite(&data_int, sizeof(data_int), 1, file);
  if (written == sizeof(data_int))
  {
    if (opt_str) fputs(opt_str, file);
  }
  fclose(file);
  return written == sizeof(data_int);
}

Примечание: этот код не был скомпилирован, и обработка ошибок является частичной.

Редактировать: если вы не закроете файл, вам придется вместо этого вызвать fflush.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...