Tag: io

C函数fwrite()不写入文件

我正在尝试将tempGroupFile结构写入GroupFile 。 写入时fwrite()返回1,但实际上没有数据写入文件GroupFile 。 函数printRec()打印出屏幕上的结构。 data是结构的变量。 这些操作后,文件GroupFile为空。 码: GWTemp = fopen(tempGroupFile, “rb”); GW = fopen(GroupFile, “wb”); if((GW == NULL) || (GWTemp == NULL)) { puts(“Failed to open file.”); fflush(stdin); getchar(); return 0; } while(fread(&data, sizeof data, 1, GWTemp)) { if(fwrite(&data, sizeof data, 1, GW)) { printRec(data); } }

使用C将整数值写入二进制文件

我试图将9位数写入二进制文件。 例如,我想写整数值:275为100010011 ,依此类推。 fwrite只允许一次写入一个字节,我不知道如何操作这些位才能做到这一点。

保存当前的读取位置,以便我可以在以后查找

我有一个程序读取具有已知结构的文本文件。 例如,我在文件的每一行都有两个整数和一个字符串。 当我在循环中使用fscanf ,我可以重新获得如上所述的n结构。 如何在数据文件中获取当前位置,因此我将其存储在某处,然后继续从我之前停止的位置读取我的文本文件。

Select()仍然阻止从管道读取

我的应用程序分叉一个孩子,孩子执行一个新的程序,父母写入它,然后在孩子完成一些工作后从孩子读回来。 当监视管道的读取结束时,程序仍然等待孩子。 我目前没有写回父母,所以它故意阻止。 下面是代码(write_to()函数关闭函数中管道的未使用部分): pid_t leaf_proc; int rv = 0; int w_pfd[2]; int r_pfd[2]; if(pipe(w_pfd) == -1 || pipe(r_pfd) == -1){ printf(“Failed to pipe. Goodbye.\n”); exit(0); } if((leaf_proc = fork()) < 0){ printf("Error: %s\n",strerror(errno)); exit(0); }else if(leaf_proc == 0){ /***Child to be execl()'d***/ rv = execl("Some program"); if(rv < 0){ printf("Error: %s\n",strerror(errno)); exit(0); } }else{ […]

如何在同步/ fsync / syncfs到便携式设备后确保数据完整性

基于同步手册页,无法保证在调用同步后光盘将刷新其缓存:“根据标准规范(例如,POSIX.1-2001),sync()调度写入,但可能在实际写入之前返回但是,由于版本1.3.20 Linux确实在等待。(这仍然不能保证数据的完整性:现代磁盘有很大的缓存。)“ 并且,在fsync手册中,没有提到这一点。 有没有办法确保在调用同步后所有写入光盘特别是便携式设备(USB)的写入? 我遇到过调用sync / fsync后数据和元数据信息没有完全写入光盘的情况。 我很好奇Windows / linux中的“安全删除设备”是如何知道所有数据都是由设备本身完全写入的。

无法实现从文件中检索n个字节的(稳定)方法

我正在开发的库的目的之一是从文件中检索指定数量的字节,在这种特定情况下,我希望访问/ dev / random来检索基于熵的随机序列。 我对fread的主要问题是它会在等待更多熵时无限期挂起,这是不必要的。 我的下一个选择就是用feof包装fread来获取块中的字节,然后我至少可以提供完整的百分比以获得更好的体验,尽管我可以收集迭代1,2,3,4 ..的字节将是很难跟踪到完全相同的数量。 在C标准中是否有一种方法允许我正在寻找的东西,确切的数量和大块? 如果我要寻找超时,那么线程化数据请求是一个很好的选择吗?

如何将多字节字符串转换为glibc中fxprintf.c中的宽字符串?

目前, glibc perror源程序中的逻辑是这样的: 如果stderr是面向的,那么按原样使用它,否则使用dup()它并在dup() ‘ed fd上使用perror() 。 如果stderr是面向广域的,则使用stdio-common / fxprintf.c中的以下逻辑: size_t len = strlen (fmt) + 1; wchar_t wfmt[len]; for (size_t i = 0; i < len; ++i) { assert (isascii (fmt[i])); wfmt[i] = fmt[i]; } res = __vfwprintf (fp, wfmt, ap); 通过以下代码将格式字符串转换为宽字符forms,我不明白: wfmt[i] = fmt[i]; 此外,它使用isascii断言: assert (isascii(fmt[i])); 但格式字符串在宽字符程序中并不总是ascii,因为我们可能使用UTF-8格式字符串,它可以包含非7位值。 为什么在运行以下代码时没有断言警告(假设UTF-8语言环境和UTF-8编译器编码)? #include #include #include #include […]

MPI I / O,单进程和多进程输出的混合

我需要一个MPI C代码通过MPI I / O将数据写入二进制文件。 我需要进程0来编写一个短标题,然后我需要整个进程范围来编写标题所指示的自己的数组。 然后我需要进程0来编写另一个头,然后是所有进程编写下一个数组的部分,等等。我想出了以下测试代码,它实际上做了我想要的。 没有人比我更惊讶。 我的问题是,我是MPI I / O的新手。 所以我“得到它”? 我这样做是“正确的方式”还是有更高效或更紧凑的方式来做到这一点? 代码是:(顺便说一句,如果您考虑测试此function,请仅使用4个触发器进行测试。) #include #include #include #include “mpi.h” #define ROWS 9 #define COLS 10 int main(int argc, char *argv[]) { int size_mpi, rank_mpi, row_mpi, col_mpi; int i,j,p,ttlcols; int sizes[]= {2*ROWS,2*COLS}; int subsizes[]= {ROWS,COLS}; int starts[] = {0,0}; int vals[ROWS][COLS]; char hdr[] = “This […]

fopen:保持开放或使用缓冲区是个好主意吗?

所以我有很多需要写的日志文件。 它们在程序开始时创建,并在程序关闭时保存到文件。 我想知道它是否更好: fopen()在程序开始时,然后在程序结束时关闭文件 – 我只需要在需要时写入文件。 这些文件是否仍然“开放”会减慢任何事情(例如其他文件io)吗? 要么 我将需要写入的内容保存到缓冲区中,然后打开文件,从缓冲区写入,在程序结束时关闭文件。 我想这会更快?

强制使用`exec`创建的程序执行无缓冲的I / O.

我正在尝试使用pipe , fork和exec与C中的外部程序进行交互。 我想强制外部程序执行无缓冲的I / O. 这是我的代码到目前为止的相关代码段: … pid = fork(); if (pid == (pid_t) 0) { /* child process */ /* make pipe connections to standard streams */ dup2(wpipe[0], STDIN_FILENO); dup2(rpipe[1], STDOUT_FILENO); /* close pipe endings */ close(wpipe[0]); close(rpipe[0]); close(wpipe[1]); close(rpipe[1]); /* unbuffered I/O */ setvbuf(stdin, NULL, _IONBF, BUFSIZ); setvbuf(stdout, NULL, _IONBF, BUFSIZ); if […]