标签: fwrite

在Mac OS X Snow Leopard上执行磁盘I/O时,C程序坚持不间断等待

一行背景:我是Redis的开发者,一个NoSQL数据库.我正在实现的一个新功能是虚拟内存,因为Redis将所有数据都存储在内存中.由于VM Redis能够将很少使用的对象从内存传输到磁盘,因此有很多原因可以解释为什么这样做比让OS为我们进行交换工作要好得多(redis对象是由非连续分配的许多小对象构建的)地方,当Redis序列化到磁盘时,它们占用的空间比它们所在的内存页面少10倍,等等.

现在我有一个完全在Linux上运行的alpha实现,但在Mac OS X Snow Leopard上运行得不是很好.有时,当Redis尝试将页面从内存移动到磁盘时,redis进程会进入不间断等待状态几分钟.我无法调试这个,但这发生在调用fseeko()fwrite().几分钟后,呼叫终于返回并且redis继续正常工作:没有崩溃.

传输的数据量非常小,类似于256字节.因此,它不应该是执行大量I/O的问题.

但是有一个关于交换文件的有趣细节,它是写操作的目标.这是一个大文件(26千兆字节)创建打开文件,fopen()然后使用放大ftruncate().最后文件是unlink()编辑,以便Redis继续引用它,但我们确信当Redis进程退出操作系统时,将真正释放交换文件.

好的,但我在这里有更多细节.顺便说一句,你甚至可以在Redis git中找到实际的代码,但鉴于这是一个相当复杂的系统,在五分钟内理解这一点并非易事.

非常感谢您的帮助.

c io macos fwrite redis

16
推荐指数
1
解决办法
1673
查看次数

如何使用fread和fwrite函数来读写二进制文件?

嗨,在我的项目中,我要读取一个.bin文件,其中包含传感器数据short(16 bit values).我正在使用fread函数进入缓冲区,但我觉得读入没有正确发生.我的意思是我写的东西和我读的东西之间没有一致性.你们能否说出这里出了什么问题?这不是我项目中的代码......我只想在这里验证freadfwrite功能.

#include<stdio.h>
void main()
{
    FILE *fp = NULL;

    short x[10] = {1,2,3,4,5,6,5000,6,-10,11};
    short result[10];

    fp=fopen("c:\\temp.bin", "wb");

    if(fp != NULL)
    {
        fwrite(x, 2 /*sizeof(short)*/, 10 /*20/2*/, fp);
        rewind(fp);
        fread(result, 2 /*sizeof(short)*/, 10 /*20/2*/, fp);
    }
    else
        exit(0);

    printf("\nResult");
    printf("\n%d",result[0]);
    printf("\n%d",result[1]);
    printf("\n%d",result[2]);
    printf("\n%d",result[3]);
    printf("\n%d",result[4]);
    printf("\n%d",result[5]);
    printf("\n%d",result[6]);
    printf("\n%d",result[7]);
    printf("\n%d",result[8]);
    printf("\n%d",result[9]);

    fclose(fp)
 }
Run Code Online (Sandbox Code Playgroud)

我做了fread()(HEX值)后:

temp.bin:
01 02 03 04 05 06 e1 8e 88 06 ef bf b6 0b...
Run Code Online (Sandbox Code Playgroud)

我做了fwrite()之后

stdout: …
Run Code Online (Sandbox Code Playgroud)

c binaryfiles fwrite fread

16
推荐指数
1
解决办法
9万
查看次数

在PHP中将大文件写入磁盘的最佳方法是什么?

我有一个PHP脚本偶尔需要将大文件写入磁盘.使用file_put_contents(),如果该文件是足够大(大约2 MB这种情况下),PHP脚本运行的内存(PHP致命错误:用尽########字节允许内存大小).我知道我可以增加内存限制,但这对我来说似乎不是一个完整的解决方案 - 必须有更好的方法,对吧?

在PHP中将大文件写入磁盘的最佳方法是什么?

php file-io file fwrite

14
推荐指数
1
解决办法
2万
查看次数

为什么'fopen'返回NULL指针?

我正在使用C编程语言编写一个简单的文件分割器/合并程序.问题是,由于某种原因,fopen返回NULL,因此,我的程序在fwrite语句中崩溃.我该如何解决?

这是C文件:

int SplitFile(char* filename, char* output, size_t size)
{
    char current_file_name[256];
    int file_count = 0, i = 0;
    FILE *file = fopen( filename, "rb" );
    printf("split %s into chunks of %d named\n", filename, size);

    if (!file)
       return E_BAD_SOURCE;
    else
    {
        output = (char *) malloc(size * sizeof(char));
        if (output == NULL)
            return E_NO_MEMORY;
        else
        {
            int bytes_read = 0;
            FILE *outFile;
            do
            {
                bytes_read = fread(output, sizeof(char), size, file );
                sprintf(current_file_name, "%s%04lu\n", "part", file_count++);
                outFile …
Run Code Online (Sandbox Code Playgroud)

c null fopen fwrite

14
推荐指数
2
解决办法
7万
查看次数

PHP Excel标题

header("Content-Type:   application/vnd.ms-excel; charset=utf-8");
header("Content-type:   application/x-msexcel; charset=utf-8");
header("Content-Disposition: attachment; filename=abc.xsl"); 
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
echo "Some Text"
Run Code Online (Sandbox Code Playgroud)

这里是使用php编写和下载xsl文件的代码,
我的问题是当我打开excel文件MS-Excel显示警告之前打开文件说

您尝试打开的文件格式与文件扩展名指定的格式不同... Blah blah

有什么与PHP代码删除此警告?内容写得正确.

我知道这是因为文件中写的内容是txt文件内容,文件扩展名不正确,即xls.解?

请不要建议使用任何库.

php header fwrite phpexcel

14
推荐指数
2
解决办法
13万
查看次数

为什么fwrite的写作比我说的要多?

FILE *out=fopen64("text.txt","w+");
unsigned int write;
char *outbuf=new char[write];
//fill outbuf
printf("%i\n",ftello64(out));
fwrite(outbuf,sizeof(char),write,out);
printf("%i\n",write);
printf("%i\n",ftello64(out));
Run Code Online (Sandbox Code Playgroud)

输出:

0
25755
25868
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?write设置为25755,我告诉fwrite将多个字节写入文件,这是在开头,然后我在25755以外的位置?

c file fwrite ftell

13
推荐指数
1
解决办法
1万
查看次数

内存映射文件和单个块的原子写入

如果我使用普通IO API读取和写入单个文件,则保证写入是基于每个块的原子.也就是说,如果我的write只修改了一个块,那么操作系统会保证写入整个块,或者根本不写入.

如何在内存映射文件上实现相同的效果?

内存映射文件只是字节数组,所以如果我修改字节数组,操作系统无法知道何时我认为写"完成",所以它可能(即使不太可能)在内存中交换内存我的块写操作的中间,实际上我写了半个块.

我需要某种形式的"进入/离开临界区",或"钉住"文件的页面到内存中,而我写它的一些方法.这样的事情存在吗?如果是这样,那可移植到常见的POSIX系统和Windows吗?

mmap acid atomic fwrite

13
推荐指数
1
解决办法
3168
查看次数

如何写一个整数到一个文件(fprintf和fwrite之间的差异)

我一直在尝试将一个整数写入文件(打开模式是w).fprintf写得正确,但fwrite写了乱码:

int length;
char * word = "word";

counter = strlen(word);
fwrite(&length, sizeof(int), 1, file);
fwrite(word, sizeof(char), length, file);
Run Code Online (Sandbox Code Playgroud)

并且文件中的结果是:

但如果我改用fprintf,就像这样:

int length;
char * word = "word";

counter = strlen(firstWord);
fprintf(file, "%d", counter);
fwrite(word, sizeof(char), length, file);
Run Code Online (Sandbox Code Playgroud)

我在文件中得到了这个结果:

4word

谁能说出我做错了什么?谢谢!

更新:我最终想把写入改为二进制(我将以wb模式打开文件),我的实现会有区别吗?

c printf fwrite

12
推荐指数
1
解决办法
4万
查看次数

在Python中使用file.write写入文件时出错.UnicodeEncodeError

我从来没有处理过编码和解码字符串,所以我就是这方面的新手.当我尝试使用Python中的file.write将我从另一个文件读取的内容写入临时文件时,我收到了一个UnicodeEncodeError.我收到以下错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u201c' in position 41333: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

这是我在我的代码中所做的.我正在读取XML文件并从"mydata"标签获取文本.然后我遍历mydata寻找CDATA

    parser = etree.XMLParser(strip_cdata=False)
    root = etree.parse(myfile.xml, parser)
    data = root.findall('./mydata')
    # iterate through list to find text (lua code) contained in elements containing CDATA
    for item in myData:
        myCode = item.text

    # Write myCode to a temporary file.
    tempDirectory = tempfile.mkdtemp(suffix="", prefix="TEST_THIS_")
    file = open(tempDirectory + os.path.sep + "myCode.lua", "w")

    file.write(myCode + "\n")
    file.close()
Run Code Online (Sandbox Code Playgroud)

当我点击以下行时,它失败了UnicodeEncodeError:

file.write(myCode + "\n")
Run Code Online (Sandbox Code Playgroud)

我应该如何正确编码和解码?

unicode encode decode fwrite python-2.7

11
推荐指数
1
解决办法
9659
查看次数

fwrite()和UTF8

我正在使用php fwrite()创建一个文件,我知道我的所有数据都是UTF8(我已经对此进行了大量测试 - 将数据保存到数据库并在普通网页上输出所有工作正常并报告为utf8.)但是我我被告知我输出的文件包含非utf8数据:(在bash(CentOS)中是否有命令检查文件的格式?

使用vim时,它将内容显示为:

Don~~~~你做什么...... It~~~~是一个很棒的网站...... We ~~ Yve刚刚推出/

任何帮助将不胜感激:确认文件是UTF8或如何将utf8内容写入文件.

UPDATE

为了澄清我如何知道我有UTF8数据,我做了以下事情:

  1. DB设置为utf8保存数据时
  2. 到数据库我先运行它:

    $enc = mb_detect_encoding($data);

    $data = mb_convert_encoding($data, "UTF-8", $enc);

  3. 就在我运行fwrite之前,我已经检查了数据注意每个数据返回'IS utf-8'

    if (strlen($data)==mb_strlen($data, 'UTF-8')) print 'NOT UTF-8'; else print 'IS utf-8';

谢谢!

php utf-8 fwrite

10
推荐指数
3
解决办法
4万
查看次数

标签 统计

fwrite ×10

c ×5

php ×3

file ×2

acid ×1

atomic ×1

binaryfiles ×1

decode ×1

encode ×1

file-io ×1

fopen ×1

fread ×1

ftell ×1

header ×1

io ×1

macos ×1

mmap ×1

null ×1

phpexcel ×1

printf ×1

python-2.7 ×1

redis ×1

unicode ×1

utf-8 ×1