标签: stdio

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

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

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

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

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

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

c scanf stdio fgets

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

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

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

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

c stdio standard-library osdev bootloader

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

为什么这段代码打印两次?

可能重复:
在linux gcc中使用fork()

#include <stdio.h>

void main ()
{
  printf ("ciao");
  fork ();
}
Run Code Online (Sandbox Code Playgroud)

我有一些关于C优化的想法,但我不确定.希望你知道答案.

c printf fork newline stdio

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

STDERR_FILENO在ubuntu上未声明

我正在尝试编译显示代码的示例堆栈跟踪.当我用以下代码编译test.c文件时:

gcc -g -rdynamic ./test.c -o test
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

./test.c: In function ‘handler’:
./test.c:16: error: ‘STDERR_FILENO’ undeclared (first use in this function)
./test.c:16: error: (Each undeclared identifier is reported only once
./test.c:16: error: for each function it appears in.)
Run Code Online (Sandbox Code Playgroud)

我的包含与原始邮政编码相同:

#include <stdio.h>
#include <execinfo.h>
#include <signal.h>
#include <stdlib.h>
Run Code Online (Sandbox Code Playgroud)

我的机器是ubuntu 13.04.我错过了一些图书馆还是没有包含一些内容?

c stdio

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

写入Rust中的文件或标准输出

我正在学习Rust,我有点难过.

我正在尝试为用户提供将输出写入stdout或提供的文件名的选项.

我开始与那正是使用给出的示例代码extra::getopts位于这里.从那里,在do_work函数中,我正在尝试这样做:

use std::io::stdio::stdout;
use std::io::buffered::BufferedWriter;

fn do_work( input: &str, out: Option<~str> ) {
    println!( "Input:  {}", input );
    println!( "Output: {}", match out {
        Some(x) => x,
        None    => ~"Using stdout"
    } );
    let out_writer = BufferedWriter::new( match out {
        // I know that unwrap is frowned upon, 
        // but for now I don't want to deal with the Option.
        Some(x) => File::create( &Path::new( x ) ).unwrap(),
        None    => stdout()
    } ); …
Run Code Online (Sandbox Code Playgroud)

file stdio rust

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

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

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

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
查看次数

Clang stdio,h 文件未找到

我使用 Visual Studio 安装了 clang,然后按照文档中的说明构建了突出显示的项目。

在此处输入图片说明

构建成功了,但是当我尝试这样做时:

clang -cc1 -analyze -analyzer-checker=core.DivideZero test.c
Run Code Online (Sandbox Code Playgroud)

它说:

test.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
         ^~~~~~~~~
1 error generated.
Run Code Online (Sandbox Code Playgroud)

我尝试了很多建议,但没有任何效果。

但是,如果我做这样的事情,它会起作用

clang --analyze text.c
Run Code Online (Sandbox Code Playgroud)

我不知道这是否使用了所有可用的检查器。我需要编写自己的检查器并进行测试...

有任何想法吗?

输出 clang --version

clang version 7.0.0 (trunk 322536)
Target: i686-pc-windows-msvc
Thread model: posix
InstalledDir: C:\path\build\Debug\bin
Run Code Online (Sandbox Code Playgroud)

c stdio clang

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

如何从 Rust 中的 stdin 读取的行中删除换行符和回车符?

我想从 stdin 读取一行并将其存储在字符串变量中,并将字符串值解析为 u32 整数值。read_line() 方法读取 2 个额外的 UTF-8 值,这会导致 parse 方法崩溃。

以下是我尝试删除回车符和换行符的内容:

use std::io;
use std::str;

fn main() {
    let mut input = String::new();
    match io::stdin().read_line(&mut input) {
        Ok(n) => {
            println!("{:?}", input.as_bytes());
            println!("{}", str::from_utf8(&input.as_bytes()[0..n-2]).unwrap());
        }
        Err(e) => {
            println!("{:?}", e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Rust 中执行此操作最惯用的方法是什么?

newline stdio utf-8 carriage-return rust

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

fscanf read()s 超过我要求的字符数

我有以下代码:

#include <stdio.h>

int main(void)
{
  unsigned char c;

  setbuf(stdin, NULL);
  scanf("%2hhx", &c);
  printf("%d\n", (int)c);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我设置stdin为无缓冲,然后要求scanf读取最多 2 个十六进制字符。确实,scanf按要求做;例如,将上面的代码编译为foo

$ echo 23 | ./foo
35
Run Code Online (Sandbox Code Playgroud)

但是,如果我strace编写程序,我发现 libc 实际上读取了 3 个字符。这是来自 strace 的部分日志:

$ echo 234| strace ./foo
read(0, "2", 1)                         = 1
read(0, "3", 1)                         = 1
read(0, "4", 1)                         = 1
35 # prints the correct result
Run Code Online (Sandbox Code Playgroud)

所以 sscanf 给出了预期的结果。但是,正在读取的这个额外字符是可以检测到的,它碰巧破坏了我试图实现的通信协议(在我的例子中是 GDB 远程调试)。

sscanf 的手册页说明了字段宽度:

当达到此最大值或找到不匹配的字符时(以先发生者为准),字符读取停止。

至少,这似乎有点欺骗性;或者它实际上是一个错误?希望使用无缓冲的标准输入,scanf 可能读取的输入量不会超过我要求的输入量,这是否太过分了? …

c stdio

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

Linux x86-64 fork 系统调用对 C 标准 libc 文件 I/O 的奇怪行为(关键字:fork、fclose、linux)

故事

我试图在 Linux 上诊断用 C 编写的应用程序中的错误。原来这个bug是由于在父进程中句柄仍然打开时在子进程中忘记 引起的。fcloseFILE *

文件操作只是read. 没有写操作。

情况1

该应用程序正在运行Linux 5.4.0-58-generic。在这种情况下,错误发生了。

案例二

该应用程序正在运行Linux 5.10.0-051000-generic。在这种情况下,没有错误,这正是我所期望的。

什么是错误?

fork如果fclose子进程中没有,则父进程执行随机数的系统调用。

案例2肯定

我完全知道忘记 fclose会导致内存泄漏,但是:

  • 我认为,只是在这种情况下,并不是绝对必要的,因为子进程会尽快退出,而我使用的退出exit(3)不是_exit(2)
  • 奇怪的是,为什么在子进程中忘记 fclose会影响父进程?

我目前的猜测:

这是一个 Linux 内核错误,已在5.4. 然而我没有证据,但我的测试向我证明了这一点。


我已经能够通过fclose在退出之前调用子进程来修复这个应用程序错误。但是,我想知道在这种情况下实际发生了什么。所以我的问题是如何fclose在子进程中忘记影响父进程?


重现问题的非常简单的代码(附上 3 个文件)。

注意:test1.c 和 test2.c 的区别只fclose在于子进程。test2.c 不会fclose在子进程中调用。

文件测试.txt

123123123
123123123
123123123
123123123
123123123 …
Run Code Online (Sandbox Code Playgroud)

c linux fork x86-64 stdio

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