标签: stdio

如何从\n分隔文件中读取字符串

我正在尝试读取返回分隔文件.充满了短语.

我正在尝试将每个短语放入一个字符串中.

问题是当我尝试用文件读取时

fscanf(file,"%50s\n",string);
Run Code Online (Sandbox Code Playgroud)

该字符串只包含一个单词.当它与空间碰撞时,它会停止读取字符串

c scanf stdio fgets

6
推荐指数
2
解决办法
3034
查看次数

用于从Perl中的系统命令输出的文件句柄

我在Perl中执行的系统命令的输出是否有文件句柄/句柄?

perl ipc pipe stdio filehandle

6
推荐指数
2
解决办法
2856
查看次数

将2d数组写入C中的文件

我曾经使用下面的代码将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数组?

c io stdio fwrite

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

C没有stdio,有什么可能吗?

我一直对编程操作系统感兴趣.通过一些不同的网站进行研究,我遇到了一个有趣的概念(换句话说):如果你开始用#include编写你的引导加载程序,你已经犯了一个致命的错误.

我已经通过了K&R,整本书都包含在每节课中.在整个学习C中使用它,我不知道我学到了什么,使用stdio,什么没有.在没有stdio的情况下,你可以用C做什么?

c stdio standard-library osdev bootloader

6
推荐指数
1
解决办法
4129
查看次数

如何为交互式控制台应用程序编写单元测试

我有一个控制台应用程序,(写成的Symfony2命令)通过读取来自用户的输入STDIN,并与帮助readline,用户输入随后被传递到eval()

整个过程只是用于"调试shell"(类似于a php -a)但在项目环境和依赖注入容器访问中.

我想为这个命令编写单元测试,但是我正在打击墙,关于如何(并且可能)为这种行为编写PHPUnit测试?

php console phpunit stdio

6
推荐指数
1
解决办法
2309
查看次数

让asprintf使用也是输入的非NULL目标指针是否安全?

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为指向一个新的缓冲[...]",我很想假设函数使用reallocgetline一样.

可能有什么问题?

使用签名int asprintf(char **ret, const char *format, ...);具体.

  1. asprintf跑得太快realloc了.

    想象一下,我们实现了这个函数,我们可以realloc(*ret)在它取消引用其中一个混淆原始缓冲区的变量之前运行.该缓冲区已被释放,这在技术上是未定义的行为.这将代表一个错误.

  2. asprintf在读取之前写入缓冲区.在上面的代码就可以成像功能拷贝的内容argv[1]*ret之前的每va_argstr参数.我引用的联机帮助页似乎并不排除这种情况.

  3. asprintffree *ret直接或通过使用realloc.这将避免问题编号(1),但如果如上所述使用会泄漏内存.再一次,该手册页似乎不排除它.

解决

通过将单个调用替换为asprintfwith,可以避免上述所有操作

{
  char …
Run Code Online (Sandbox Code Playgroud)

c alias stdio

6
推荐指数
1
解决办法
1299
查看次数

如何通过Rust中的stdin将输入发送到程序

我试图在Rust写一个shell.shell的一个功能是能够将输入重定向到文件,将文件重定向到输入,以及将程序的输出管道输出到另一个程序.我正在使用run::process_output函数std来运行程序并获取它们的输出,但我不知道如何在运行之后将输入发送为程序员的stdin.有没有办法创建一个直接连接到run程序的对象,并像在stdin中输入一样输入输入?

shell stdio rust

6
推荐指数
2
解决办法
4381
查看次数

fwrite()将垃圾数据添加到输出(WINE&Windows 7,mingw&MSVC; NOT linux/gcc)

在某些情况下,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)

c windows stdio fwrite

6
推荐指数
1
解决办法
630
查看次数

转换流以将字符串添加到每一行

我产生了一个像这样的子进程:

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

stdio node.js node-streams

6
推荐指数
2
解决办法
1021
查看次数

C-文件输入/输出缓冲区和setvbuf()

在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()函数引用了什么缓冲区?

c buffer file stdio

6
推荐指数
1
解决办法
244
查看次数

标签 统计

stdio ×10

c ×6

fwrite ×2

alias ×1

bootloader ×1

buffer ×1

console ×1

fgets ×1

file ×1

filehandle ×1

io ×1

ipc ×1

node-streams ×1

node.js ×1

osdev ×1

perl ×1

php ×1

phpunit ×1

pipe ×1

rust ×1

scanf ×1

shell ×1

standard-library ×1

windows ×1