C:无法在文件上写入数据

时间:2010-11-18 13:13:35

标签: c linux

我想打开一个文件,在上面写一些数据,所以我必须使用(Fopen)“我不能使用open,因为我需要在其他一些事情上打开”

现在,如果我想使用fwrite在文件上写它,我不知道为什么这就是我在我的代码#option1中提到的,但是如果我得到文件描述符并使用正常的write方法工作正常,请参阅下面的#option 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

修改

我的file_data是这样的

  1. 为整数(必需)保留4个字节
  2. 为字符串保留200个字节(可选)

8 个答案:

答案 0 :(得分:1)

如果要检查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);
}

答案 1 :(得分:1)

首先:

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

fileNULL(失败时)或不是(成功时) - 没有必要对它进行测试,因为它是一个指针(因此,无符号)。

您的fwrite调用似乎没问题,但您应该确保您尝试编写的数量是正确的(file_data内是否有以空字符结尾的字符串?)。

您可能遇到的另一个问题是您没有关闭或刷新文件 - 这可能会导致某些数据保留在文件缓冲区中而不会写入磁盘。

答案 2 :(得分:1)

缓冲IO操作使用由C lib管理的缓冲区。你的“问题”是fwrite是缓冲的,这意味着为了写入文件,你很可能需要用fflush()刷新它或者只是关闭文件。

答案 3 :(得分:0)

乍一看,错误似乎在第2行:

int file_size = strlen(file_data);

仅当存在终端nul字符时才有效。因此,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。

答案 4 :(得分:0)

我认为您需要执行fclose(文件)或fflush(文件)。因为fopen是缓冲IO所以它不会立即写入,所以为了确保完成文件写入,你需要这样做。

答案 5 :(得分:0)

fwrite用于二进制输出,因此您必须使用“wb”打开文件

答案 6 :(得分:0)

您必须在fflush(file);之后加fwrite来强制写入数据,或者您也可以在setbuf(file, NULL);之后执行fopen来完全删除缓冲区调用

答案 7 :(得分:0)

我猜你的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);
    }
}

你知道,这是你的意思。我使用sizeof而不是strlen来确定将要写入的字节数...

BR