我想打开一个文件,在上面写一些数据,所以我必须使用(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是这样的
答案 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;
}
file
是NULL
(失败时)或不是(成功时) - 没有必要对它进行测试,因为它是一个指针(因此,无符号)。
您的fwrite调用似乎没问题,但您应该确保您尝试编写的数量是正确的(file_data
内是否有以空字符结尾的字符串?)。
您可能遇到的另一个问题是您没有关闭或刷新文件 - 这可能会导致某些数据保留在文件缓冲区中而不会写入磁盘。
答案 2 :(得分:1)
缓冲IO操作使用由C lib管理的缓冲区。你的“问题”是fwrite是缓冲的,这意味着为了写入文件,你很可能需要用fflush()
刷新它或者只是关闭文件。
答案 3 :(得分:0)
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