如何在 Rust 中通过 stdin 向程序发送输入信息
我试图用锈蚀写一个外壳.外壳的功能之一是能够将输入重定向到文件,将文件重定向到输入,然后将程序的管道输出转移到另一个程序中.我正在使用std中的run::process_output函数来运行程序并获取其输出,但是我不知道如何将输入发送在运行后,就好像它是stdin一样.是否有某种方法可以创建直接连接到RAN程序的对象并将其推入输入,例如在Stdin中输入? 解决方案 此程序演示了如何启动外部程序并将其stdout -stdin一起流式传输: use std::io::{BufRead, BufReader, BufWriter, Write}; use std::process::{Command, Stdio}; fn main() { // Create some argument vectors for lanuching external programs let a = vec!["view", "-h", "file.bam"]; l
32 2024-04-22
编程技术问答社区
在C语言中写整数到文件的最快方法
我正在为编程做作业. 我试图编写包括三个空间划界十进制整数字符串,然后在文件中的'\ n'的许多行.问题是,fprintf太慢了(它们的参考时间或多或少速度速度更快). 我尝试了很多可能性(一切都在循环中). fprintf(太慢): fprintf(f, "%d %d %d\n", a[i], b[i], c[i]); 转换为字符串,然后将字符串放入其中 - 甚至更糟: sprintf(buffer, "%d", a[i]); //or: _itoa(_itoa(a[i], buffer, 10); fputs(buffer, f); fputc(' ', f); 是否有任何快速的方法将整数编号写入简单的文本文件(.txt)(最后一个解决方案的时间为220ms,参考为140ms供您描绘时间)?我一直在尝试和谷歌搜索地狱,但是什么都没有起作用.但是,如果时间很短,则必须有某种方式! ps:数字一直是整数,大小为4个字节,始终以格式: a0 b0 c
10 2024-04-10
编程技术问答社区
使用标准C库将文件读到内存中--Windows会过早识别EOF,但在Mac、Linux上可以工作。
这感觉就像最愚蠢的问题,但希望有人可以提供帮助.抱歉,帖子很长,但是我想提供足够的细节,以便人们不建议我已经尝试过的事情. 我隔离了我编写的C程序的问题,该问题应该在Mac,Linux和Windows上运送.该程序在Windows上不起作用,但在Mac和Linux上正确工作,并且在最近的更改之前曾在Windows上工作. 失败的直接原因与将文件读取到内存块中有关 - 因此,我将该代码仅隔离到一个自包装程序中,并使用一些示例数据在Windows上可靠地失败并在Mac和Mac和Linux. 应该指出的是,在Windows上,我正在使用Visual Studio 2019(版本16.5.5).我正在使用Windows 10 Enterprise在64位Dell笔记本电脑上测试它.在Linux上,我正在使用GCC(我正在使用Ubuntu 20.04进行测试).在Mac上,我使用clang对其进行了编译.该程序旨在便携(至少在这三个平台之间). 加载文件的基本策略是使用fo
18 2024-04-10
编程技术问答社区
stdin中是否包含一个回车符(\r)?
在所以答案我写了此代码: char fail_on_eof (int c) { if (c == EOF) exit (EXIT_FAILURE); return (char) c; } void skip_to_next_line (void) { char c; do { c = fail_on_eof (getchar ()); } while (c != '\n'); } 我想知道是否有任何终端可以返回'\r'(只要在线末端也有'\n'). ). stdin曾经包含'\r'(在任何平台上)?输入重定向总是在文本模式下工作呢? 解决方案 当然,这很容易.您可以从包含该字符的文件中读取,也可以执行类似(Linux和类似操作系统)之类的操作: printf "\r" | yourProgram ,甚至是从允许逃逸的终端程序中,例如 ctrl-v ctrl-m .
16 2024-04-10
编程技术问答社区
C语言中的fscanf和fprintf是否有缓冲?
我想编写一个有效的C程序,该程序使文件的副本.似乎没有函数(例如 fprintf 在stdio.h中,但是他们的描述没有说出它们是如何或是否缓冲的.它们是否在不同的缓存级别之间进行缓冲? (我认为磁盘到内存缓冲区由OS处理) 解决方案 当您打开fopen的文件时,它将被完全缓冲. 使用setvbuf>(参考). 在FILE对象上使用任何普通的I/O函数将利用缓冲. 如果您只是复制数据,则将进行顺序读取和写入,不一定需要缓冲.但是,有效地做到这一点确实需要为I/O操作选择适当的块大小.传统上,这与磁盘扇区的大小有关(4096字节),但该值并非未来. fopen使用的默认值为BUFSIZ. 与任何优化一样,构建实际测试以验证您的性能增长(或损失). 最后,对于最快的I/O,您可能必须使用特定于OS的API. C I/O函数仅映射到这些API的一般情况下,但是对于操作系统可能会有特殊的性能设置,您无法通过C库控制.在为Windows撰写快速的Avi作家时,
8 2024-04-10
编程技术问答社区
fprintf函数不工作,但它返回正数
我正在使用以下方式使用fprintf.一切似乎都可以,但是fprintf根本不打印到我的文件! fprintf(pFile, "%s\n", "print"); 奇怪的东西是fprintf返回OK.它在上述代码中返回6,但不打印到文件! 该文件是成功创建的,但是空的. 将其更改为printf也正在打印,OK也是. 解决方案 fprintf和其他STDIO输出功能是缓冲的,这意味着该输出首先存储在内存中,直到以后才真正打印.当使用标准输出打印到屏幕时,每条新线路都会冲洗缓冲区,因此,使用printf,您会立即看到输出,但是当打印到文件时,在您写入(例如)4096之前,该缓冲区不会被冲洗字节.您可以添加fflush(pFile);以冲洗缓冲区,如果您出于某种原因需要快速出现输出. 调用fclose时也会刷新缓冲区,或通过正确退出程序隐式关闭文件,但是如果程序不关闭而不关闭文件,或者如果崩溃,则需要fflush查看在文件上输出.
16 2024-04-10
编程技术问答社区
fgetc返回一个未知的字符
我有以下代码: FILE *f = fopen('/path/to/some/file', 'rb'); char c; while((c = fgetc(f)) != EOF) { printf("next char: '%c', '%d'", c, c); } 由于某种原因,在文件末尾打印字符时,将与ASCII ordinal -1一起打印出一个不可渲染的字符. next char: '?', '-1' 这应该是什么角色?我知道这不是EOF,因为对此进行了检查,并且在字符打印后迅速(程序segfault)很快. . 解决方案 问题是fgetc()及其亲戚返回int,而不是char: 如果未设置输入流的文件末期指示器,并且 存在下一个字符,fgetc函数以unsigned char转换为int的fgetc函数,并推进了关联的文件位置指示器 流(如果定义). 如果设置了该流的文件末期指示器,或者流在文件末端,则 设置了流的文件指示器,fg
16 2024-04-10
编程技术问答社区
缓冲区的指针和文件的指针之间有什么区别?
在" c编程:现代方法"的第22章中,解释了标题的基础知识. 一个让我有些困惑的细节是a 指针指向缓冲区的指针 和指针(称为FILE *). 考虑以下内容(通过引发混淆): fopen原型为:FILE *fopen(const char * restrict filename, const char * restrict mode). fflush原型int fflush (FILE *stream). fflush被描述为函数潮红. setvbuf原型为int setvbuf (FILE * restrict stream, char * restrict buf, int mode, size_t size).当作者描述此功能时,他将第二个参数(buf)称为缓冲区的地址 ...,这可能与指针相同的想法. 首先,据我了解(尤其是考虑到fflush和setvbuf中的第一个参数的名称选择),A stream 在语义上等同于指向文件的指
14 2024-04-09
编程技术问答社区
实现从文件中检索n个字节的(稳定)方法有困难
我正在开发的库的目的之一是从文件中检索指定数量的字节基于熵的随机序列. 我对架子的主要问题是,它在等待更多熵时会无限期地悬挂,这是不需要的.我的下一个选择本来是用feof包裹fread feof,以在块中拿起字节,然后我至少可以提供百分比,以获得更好的体验很难跟踪以完全等于所需的数量. C标准中是否有一种方法可以允许我寻找的东西,确切的量和块?如果我要查找此暂停,是否将数据请求线程介绍是一个不错的选择? 解决方案 定义"标准".您的意思是ISO C标准吗? posix? Linux标准基础(LSB)?对于POSIX, 也就是说,您应该问自己是否需要熵水平.您可能(或可能无法)可以从"/dev/urandom"中脱颖而出.当然,您必须确定是否是这种情况. 其他解决方案 尝试此 这是我认为可以解决您的问题的函数的人页面. > 我刚刚看到架子不起作用,fgets从文件流读取一定数量的旁边
16 2024-04-09
编程技术问答社区
用C语言从文件中读取字符串和整数的组合
我是C Langugage的新手,所以请忍受我.我尝试读取包含字符串的文件,但获得的输出是单个字符. #include #include #include #define CALLOC(num, type) ((char*)calloc (num, sizeof(char))) #define FREE(addr) (free((void*) (addr))) int i, count; char *x, *y, *z; int main (void) { FILE *stream; if ( (stream = fopen ( "test.txt", "r" )) == NULL ) { printf ("Cannot read the new file\n"); exit (1); } count = 3; x=CALLOC(count, char); y=CALLOC(count, char);
16 2024-04-09
编程技术问答社区
如何在C语言中打印居中对齐的字符串
任何人都可以帮助我打印string对齐至C? 中心 例如: int main() { int a = 20; char x[10] = "Hello"; char y[10] = "Hello"; printf ("%*s\n",a, x ); printf ("%-*s\n",a,y); } 在上面的第一个印刷品Hello向右对齐,第二个printf像 Hello Hello 将每个长度限制为20. 是否有一种打印在中心对齐的Hello的方法. Hello 将总长度限制为20. 谢谢你 解决方案 通常,您可能想避免使用中心的文本,尤其是在控制台上,但无论如何;这将需要一些. printf不知道该怎么做的(可能)原因是,这不是完全确定的操作.并非所有字符串都可以集中在所有空间中. 值得注意的是,除
18 2024-04-09
编程技术问答社区
如何在C中的一个输入中获得多个字符
我是C编程的新手,所以我正在尝试编写一件代码,需要在十六进制中使用IP地址,但我不知道该怎么做.据我所知,我无法获得 char 的多次输入,但是 int 当用户输入'a'时,它结果证明是大量的. 对于十进制输入,我写了类似的东西 int main(){ int IP_1,IP_2,IP_3,IP_4; printf("Enter the IP address:\n"); scanf("%d.%d.%d.%d",&IP_1,&IP_2,&IP_3,&IP_4); 我使用了4个变量,因为以后我将使用这些数字进行转换. 编辑:对不起,我无法使用hexadecimal%X或数组/字符串 解决方案 有什么问题? 当您输入字母时的巨大价值是因为scanf()不识别该字母是INT的有效输入,并停止阅读,而剩下的变量未分配. 如何解决它? 首先,您应该检查您是否读取了您预期的许多变量: if (scanf("%d.%d.%d.%d"
26 2024-04-09
编程技术问答社区
GetFileInformationByHandle()用于stdio文件手柄
有什么方法可以将getFileInformationByHandle()与fopen()分配的stdio文件处理?使用fileno()将fstat()使用不足以满足我的目的()? 解决方案 使用 _fileno() 获取文件号(不,我不知道为什么Microsoft除了" ISO C ++符合能力"之外)然后 _get_osfhandle() 从文件编号转到HANDLE.我不记得MSVCRT为什么使用文件号而不是直接将FILE绑在HANDLE上(但我认为这是用于POSIX兼容性的?).
18 2024-04-09
编程技术问答社区
C freopen描述符-手动关闭/保持打开状态
我在没有问自己这个问题之前一直在使用freopen(来自stdio.h)功能.但是现在我不确定. 例如.我重新打开了Stdout: #define OUTPUT_FILE "out.txt" if ( freopen(OUTPUT_FILE,"w+",stdout) == NULL) printf("logout can't be opened\n"); 通常,每个过程都有并且会自动处理Stdout,Stderr,Stdin,我们不需要关闭它们. 但是在这里怎么样?我重新打开了Stdout. 我应该致电FCLOSE关闭重新打开的Stdout吗? ps 我很高兴查看执行此操作的一部分,而不是听到我可以相信这里一切都很好. 预先感谢您提供的任何提示. 解决方案 fclose(stdout);致力于关闭重定向. 关闭文件手通常是更干净的. 如果程序退出时,则打开filepointer, 它将为您关闭. 但是,
18 2024-04-09
编程技术问答社区
为什么 "fopen "函数不使用枚举?
使用const char*选择开放模式的原因是什么,而不是这样的enum: enum open_mode { READ, READ_BINARY, WRITE, ... }; 使用枚举不再是更简单的? 解决方案 原因很可能是历史的:函数fopen已经存在于该语言的早期K&R版本中,而enum仅添加到ANSI标准的语言中. 在添加时间enum时,语言已经在如此广泛的使用中,以致更改这种重要功能的签名是不切实际的. 其他解决方案 这是为实施提供自由.例如,在 vc ++ 中有可能选择编码等可能性: fopen("test.xml", "wt+,ccs=UNICODE")
16 2024-04-09
编程技术问答社区
我在哪里可以找到源代码来'真正'了解stdio.h中的标准函数在做什么?
像我一样,作为一个新生,在搜索标题文件(例如stdio.h)之类的函数时遇到了很大的困难.不知何故,我在某个地方找到了一些信息,这些信息在查看标题文件中以"查看事物的工作方式"时不应该害怕. (C ++底漆Plus,Stephen Prata) 我对标题文件的经验不足,至少可以说. . 在尝试找到getchar()的尝试中,我发现stdio.h只是向越来越多的标题分支,并且找到getchar()变得越来越复杂且耗时,我从未找到它.显然,我要解决这一切,我的意图只是为了找到我正在使用的功能的一些源代码. 我的问题是:我在哪里可以找到源代码来真正"理解"标准功能是"真正"的? 解决方案 如果您正在寻找可变订单或其他用法注释的声明,只需使用在线参考或man. 如果您正在寻找实际代码,请查看C标准库的实现,例如GNU的 libc . 值得注意的是,实现并不简单,并且它们的依赖性图远广泛.它们还倾向于在我们大多数人习惯的较低水平上与机器互动. 考虑LIBC
18 2024-04-09
编程技术问答社区
尽管导入了stdio,但getline没有在此范围内声明。
我需要在C中使用getline(),但是当我写作时: #define _GNU_SOURCE #include #include #include int main(int argc, char** argv) { char *line; getline(&line, NULL, stdin); free(line); return (0); } 编译器写作error: getline was not declared in this scope我该怎么办? stdio.h中的getline不是被授权吗?我以前从未有过这样的问题. 我使用GCC GNU编译器. 解决方案 您需要定义_GNU_SOURCE使用此功能,要么在包含stdio.h之前将其定义,要么将其传递给编译为-D_GNU_SOURCE,因为这是GNU扩展功能. 另一个可能的原因是您的glibc没有此功能,所以要
16 2024-04-09
编程技术问答社区
为什么C语言中的控制台图形如此缓慢?
我正在尝试仅使用控制台图形制作S Imple游戏,但是由于某种原因,即使我使用putc()而不是printf(),即使我所做的只是在显示 @的printf()时,平均平均14 fps也非常慢. sighns. 代码: #include #include #include const int sizeX = 20; const int sizeY = 20; int grid[20][20]; void draw_screen() { system("cls"); int y, x; for (y = 0; y
14 2024-04-09
编程技术问答社区
使用c中的getchar()backspace和多键字符
我正在阅读Beej的C编程指南,并复制了他的readline()函数,该函数读取了stdin的行.由于实现的方式,阅读多材料字符没有问题,因为它根据接收的字节的总量将空格重新关注,因此,Unicode输入没有问题.这是一个包含功能的程序: #include #include #include #define printPrompt printf("db > ") /* The readLine function, allocates memory for a short string and ** reads characters into it. When the string's size limit is met, ** the same memory block is reallocated, but twice the size. ** Shamelessly stolen from BeeJ's gui
22 2024-04-09
编程技术问答社区