使用C在文本文件中返回随机行的最佳方法是什么?它必须使用标准I/O库(<stdio.h>),因为它适用于Nintendo DS自制程序.
澄清:
这是我的代码的一小部分.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
...
FILE * pipe;
...
pipe = popen ("ls /tmp -1", "r");
...
pclose(pipe);
Run Code Online (Sandbox Code Playgroud)
blarg.c:106: warning: implicit declaration of function ‘popen’
blarg.c:106: warning: assignment makes pointer from integer without a cast
blarg.c:112: warning: implicit declaration of function ‘pclose’
blarg.c:118: warning: assignment makes pointer from integer without a cast
Run Code Online (Sandbox Code Playgroud)
我真的不确定.我查了一下popen,它需要的是stdio.h.缺少什么,或者是我的其余代码中的问题(我真的不想显示更多的代码,因为它是一个赋值).
我有一个Java线程:
class MyThread extends Thread {
@Override
public void run() {
BufferedReader stdin =
new BufferedReader(new InputStreamReader(System.in));
String msg;
try {
while ((msg = stdin.readLine()) != null) {
System.out.println("Got: " + msg);
}
System.out.println("Aborted.");
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
}
在另一个线程中,如何stdin.readline()在此线程中中止调用,以便打印此线程Aborted.?我试过了System.in.close(),但这没有任何区别,stdin.readline()仍然是阻塞.
我对没有的解决方案感兴趣
System.in).我正在阅读Kernighan的C编程书,并且遇到了这个问题.两者之间的差异或他们各自的使用标准.我在StackOverflow上发现了一些处理此问题的帖子.我得到了答案的一部分,但理解它们有点麻烦.
正如他们在这里提到的(putc需要stdout,vs puts):
根据Kernighan的书,
putc它相当于fputc但putc可以作为宏实现,并且putc可以不止一次地评估它的流参数.
putc和之间的区别fputc是,通过使用putc,您冒着运行本质上不安全的宏版本的风险,因为它可能不得不多次评估其流参数.这导致大多数人不知道并且因此不注意的并发症,因此fputc更好地使用.fputc的宏没有这个问题.
问题:
putc可以作为一个宏实现但是同样的问题是什么fputc?
第二个声明提到了一些并发症和安全问题.那些是什么?
putc不止一次地评估它的论点.那么与评估论证相比,它带来了哪些优点或缺点.
我正在尝试做一些我认为应该简单的事情:从标准输入执行阻塞读取,但如果没有可用数据,则在指定的时间间隔后超时.
在Unix世界中,这很简单,select()但在Windows中不起作用,因为stdin它不是套接字.如果没有创建额外的线程等,下一个最简单的选择是什么?
我正在使用针对Win32环境的visual C++.
到目前为止我尝试过:
使用select(如果输入不是套接字则不起作用)
使用WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE)). - 雷米的第一个建议.如果标准输入是控制台(其他人报告了同样的问题),当你调用它时,它总是会立即返回
使用重叠IO并执行WaitForSingleObject(Remy的第三个建议).在这种情况下,当输入来自控制台时,读取似乎总是阻塞 - 似乎stdin不支持异步I/O.
目前我认为我唯一剩下的选择是创建一个线程,它将执行阻塞读取然后发出事件信号,然后让另一个线程等待事件超时.
我正在尝试使用在visual studio中使用mingw编译的库.但是,我收到以下链接器错误:
错误LNK2001:未解析的外部符号__imp___iob
错误LNK2019:函数中引用了未解析的外部符号__imp___pctype
错误LNK2019:函数中引用了未解析的外部符号__imp____mb_cur_max
错误LNK2001:未解析的外部符号_fprintf
我能够通过链接与legacy_stdio_definitions.lib来修复_fprintf错误,如下所示:未解析的外部符号__imp__fprintf和__imp____iob_func,SDL2.
但是,我不知道如何解决其他三个未解决的外部问题.我怎样才能解决这个问题?这些库在Visual Studio 2013下完美运行.
编辑:
好的,这是一个更新.我将libmsvcrt.a从mingw lib文件夹移动到Visual Studio中,然后将其添加到链接器设置中.现在它似乎正常工作.
print2fp(const void *buffer, size_t size, FILE *stream) {
if(fwrite(buffer, 1, size, stream) != size)
return -1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如何将数据写入字符串流而不是文件流?
我正在查看/usr/include/stdio.h
碰巧遇到了下面这段代码.
/* Standard streams. */
extern struct _IO_FILE *stdin; /* Standard input stream. */
extern struct _IO_FILE *stdout; /* Standard output stream. */
extern struct _IO_FILE *stderr; /* Standard error output stream. */
/* C89/C99 say they're macros. Make them happy. */
#define stdin stdin
#define stdout stdout
#define stderr stderr
Run Code Online (Sandbox Code Playgroud)
我的问题是,这个结构struct _IO_FILE声明在哪里,我想看看布局.以及代码提到
#define stdin stdin
Run Code Online (Sandbox Code Playgroud)
这应该怎么样?
当我在互联网上搜索了这两个库之间的区别,大家都说<iostream>是标准我的C/O库++和<cstdio>是C.我的教授说,cin>>并cout<<没有很好的功能,如果我们使用cin>>很多次我们的应用程序绝对会崩溃.他还表示,stdio输入和输出的速度提高了近3倍iostream.但是,我更喜欢使用iostream因为它更方便,而且我也不知道我的教授是否正确.
那么你建议我用什么?
我需要读取一行文本(由换行符终止),而不对长度做出假设.所以我现在面对各种可能性:
fgets每次使用并检查最后一个字符是否为换行符并连续附加到缓冲区fgetc偶尔realloc使用缓冲区读取每个字符Intuition告诉我fgetc变体可能会变慢,但是我再也看不出如何fgets在不检查每个角色的情况下做到这一点(我的直觉也不总是那么好).线条非常大,因此性能很重要.
我想知道每种方法的优缺点.先感谢您.