我正在尝试读取返回分隔文件.充满了短语.
我正在尝试将每个短语放入一个字符串中.
问题是当我尝试用文件读取时
fscanf(file,"%50s\n",string);
Run Code Online (Sandbox Code Playgroud)
该字符串只包含一个单词.当它与空间碰撞时,它会停止读取字符串
我在Perl中执行的系统命令的输出是否有文件句柄/句柄?
我曾经使用下面的代码将1D数组写入文件:
FILE *fp;
float floatValue[5] = { 1.1F, 2.2F, 3.3F, 4.4F, 5.5F };
int i;
if((fp=fopen("test", "wb"))==NULL) {
printf("Cannot open file.\n");
}
if(fwrite(floatValue, sizeof(float), 5, fp) != 5)
printf("File write error.");
fclose(fp);
/* read the values */
if((fp=fopen("test", "rb"))==NULL) {
printf("Cannot open file.\n");
}
if(fread(floatValue, sizeof(float), 5, fp) != 5) {
if(feof(fp))
printf("Premature end of file.");
else
printf("File read error.");
}
fclose(fp);
for(i=0; i<5; i++)
printf("%f ", floatValue[i]);
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我想写和读取2D数组?
我一直对编程操作系统感兴趣.通过一些不同的网站进行研究,我遇到了一个有趣的概念(换句话说):如果你开始用#include编写你的引导加载程序,你已经犯了一个致命的错误.
我已经通过了K&R,整本书都包含在每节课中.在整个学习C中使用它,我不知道我学到了什么,使用stdio,什么没有.在没有stdio的情况下,你可以用C做什么?
我有一个控制台应用程序,(写成的Symfony2命令)通过读取来自用户的输入STDIN,并与帮助readline,用户输入随后被传递到eval()
整个过程只是用于"调试shell"(类似于a php -a)但在项目环境和依赖注入容器访问中.
我想为这个命令编写单元测试,但是我正在打击墙,关于如何(并且可能)为这种行为编写PHPUnit测试?
tl; dr可以asprintf天真地用于连接而无需调用临时指针?
asprintfGNU引入并在其他几个clib实现中采用的函数是使用类似方案在c中进行任意连接的诱人解决方案
int i=0;
char *str = strdup(argv[i]);
while (argv[++i]) {
asprintf(&str,"%s %s",argv[i],str); // <=== This line
}
asprintf(&str,"%s\n",str);
Run Code Online (Sandbox Code Playgroud)
当包裹在主要和必要的包含,这对我来说运行良好.
是否在整个地方泄漏记忆?Valgrind说它在我的盒子上.这是一个错误吗?
我面前的那个人页说
asprintf()和vasprintf()函数将*ret设置为指向缓冲区的指针,该缓冲区足以容纳格式化的字符串.应该将此指针传递给free(3)以在不再需要时释放已分配的存储.如果无法分配足够的空间,asprintf()和vasprintf()将返回-1并将ret设置为NULL指针.
在这句话中由于缺少"设置*ret为指向一个新的缓冲[...]",我很想假设函数使用realloc的getline一样.
使用签名int asprintf(char **ret, const char *format, ...);具体.
asprintf跑得太快realloc了.
想象一下,我们实现了这个函数,我们可以realloc(*ret)在它取消引用其中一个混淆原始缓冲区的变量之前运行.该缓冲区已被释放,这在技术上是未定义的行为.这将代表一个错误.
asprintf在读取之前写入缓冲区.在上面的代码就可以成像功能拷贝的内容argv[1]到*ret之前的每va_arg对str参数.我引用的联机帮助页似乎并不排除这种情况.
asprintf不free *ret直接或通过使用realloc.这将避免问题编号(1),但如果如上所述使用会泄漏内存.再一次,该手册页似乎不排除它.
通过将单个调用替换为asprintfwith,可以避免上述所有操作
{
char …Run Code Online (Sandbox Code Playgroud) 我试图在Rust写一个shell.shell的一个功能是能够将输入重定向到文件,将文件重定向到输入,以及将程序的输出管道输出到另一个程序.我正在使用run::process_output函数std来运行程序并获取它们的输出,但我不知道如何在运行之后将输入发送为程序员的stdin.有没有办法创建一个直接连接到run程序的对象,并像在stdin中输入一样输入输入?
在某些情况下,fwrite写入额外数据(比请求的字节多).简短演示的输出是最简单的解释方式.该演示尝试创建两个2048字节的文件,并在每次fwrite调用后检查偏移量,以确定写入的字节数.第一个fwrite调用写入两个额外的字节:
len: 2048
current offset = 0
wrote 1024 bytes
current offset = 1026
EXITING:
offset % BLOCKSIZE = 2
len: 2048
current offset = 0
wrote 1024 bytes
current offset = 1024
wrote 1024 bytes
SUCCESS
Run Code Online (Sandbox Code Playgroud)
当编译为ELF(unix二进制文件)时,程序成功运行(写入2048字节到两个文件),但在编译为PE(Windows二进制文件/可执行文件)时失败(如上所示).我尝试过编译和测试:
Ubuntu 14.04 and gcc 4.8.2 - SUCCESS
WINE 1.6.2 and mingw 4.8.2 - FAIL
Windows 7 and mingw 4.8.2 - FAIL
Windows 7 and Visual Studio 2013 - FAIL
Run Code Online (Sandbox Code Playgroud)
传递的缓冲区中的实际数据fwrite会影响写入的额外字节数,但实际上每次都会发生这种情况(除非您写入NULL字节).
main.c中:
#include <stdio.h>
#include …Run Code Online (Sandbox Code Playgroud) 我产生了一个像这样的子进程:
const n = cp.spawn('bash');
n.stdout.pipe(process.stdout);
n.stderr.pipe(process.stderr);
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个转换流,以便我可以在孩子的每一行的开头添加类似'[child process]'的东西,所以我知道stdio来自孩子而不是父进程.
所以它看起来像:
const getTransformPrepender = function() : Transform {
return ...
}
n.stdout.pipe(getTransformPrepender('[child]')).pipe(process.stdout);
n.stderr.pipe(getTransformPrepender('[child]')).pipe(process.stderr);
Run Code Online (Sandbox Code Playgroud)
有没有人知道是否有这样的现有转换包或如何写一个?
我有这个:
import * as stream from 'stream';
export default function(pre: string){
let saved = '';
return new stream.Transform({
transform(chunk, encoding, cb) {
cb(null, String(pre) + String(chunk));
},
flush(cb) {
this.push(saved);
cb();
}
});
}
Run Code Online (Sandbox Code Playgroud)
但我担心它在边缘情况下不起作用 - 其中一个块突发可能不包含整行(对于很长的行).
看起来这里的答案就在这里:https://strongloop.com/strongblog/practical-examples-of-the-new-node-js-streams-api/
但是这个附录:https: //twitter.com/the1mills/status/886340747275812865
在C语言中,fopen()是否真的创建了两个缓冲区,一个用于输入,另一个用于输出?
这就是我的C书所说的:
通常,使用标准I/O的第一步是使用f open()打开文件.(回想一下,stdin,stdout和stderr文件是自动打开的.)fopen()函数不仅打开一个文件,而且设置一个缓冲区(两个缓冲区用于读写模式),并设置一个数据包含有关文件和数据的数据的结构
如果使用fopen()打开文件,则会创建两个缓冲区,处于写入模式,如"a +",即读取和写入
FILE * fp = fopen ("file.txt", "a +");
setvbuf (destination_file, NULL, _IOFBF, BUFFER_SIZE);
Run Code Online (Sandbox Code Playgroud)
setvbuf()函数引用了什么缓冲区?