GVKun编程网logo

在C中将stdin与select()一起使用(stdin和stdout用法c语言)

10

本文将分享在C中将stdin与select的详细内容,并且还将对一起使用进行详尽解释,此外,我们还将为大家带来关于c–将setvbuf()与STDIN流一起使用、c–自定义迭代器与std::sort一

本文将分享在C中将stdin与select的详细内容,并且还将对一起使用进行详尽解释,此外,我们还将为大家带来关于c – 将setvbuf()与STDIN流一起使用、c – 自定义迭代器与std :: sort一起使用但不与tbb :: parallel_sort一起使用?、c# – 将SqlTransaction与SqlDataReader一起使用、jquery-select2 – 将select2与json数据一起使用,该数据没有一个名为“text”的字段,同时避免复制项目并丢失标准行为的相关知识,希望对你有所帮助。

本文目录一览:

在C中将stdin与select()一起使用(stdin和stdout用法c语言)

在C中将stdin与select()一起使用(stdin和stdout用法c语言)

我有以下程序:

 #include <stdio.h> #define STDIN 0 int main() {    fd_set fds;    int maxfd;    // sd is a UDP socket    maxfd = (sd > STDIN)?sd:STDIN;    while(1){        FD_ZERO(&fds);        FD_SET(sd, &fds);         FD_SET(STDIN, &fds);        select(maxfd+1, &fds, NULL, NULL, NULL);        if (FD_ISSET(STDIN, &fds)){              printf("\nUser input - stdin");        }        if (FD_ISSET(sd, &fds)){              // socket code        }     } }

我面临的问题是,一旦在STDIN上检测到输入,消息“ User input-
stdin”就继续打印…为什么在循环检查哪一个描述符已输入的同时,它一次又不打印一次?

谢谢。

答案1

小编典典

select功能仅在有可用输入时告诉您。如果您实际上并没有消耗它,那么select将继续直接下降。

c – 将setvbuf()与STDIN流一起使用

c – 将setvbuf()与STDIN流一起使用

我正在写一个小C程序,必须接受大于4096字节的输入流.

我确实找到了一个建议在这里使用setvbuf()的帖子:

Making fgets issue longer read() calls on linux

我仍然很难让这个工作 – 这是我正在努力的代码:

int main(void) 
{ 
#define MAX_STRING_SIZE 7168

char input_string[MAX_STRING_SIZE];

printf( "Input: " );

setvbuf( stdin,NULL,_IONBF,0 );

fgets( input_string,MAX_STRING_SIZE-1,stdin );

printf( "\n" );
printf( "%s",input_string );
}

有没有人成功增加这个输入缓冲区?

我的环境:Ubuntu 10.10带有build-essential包

谢谢!

解决方法

现在你正在使用_IONBF,这意味着没有缓冲.使用_IOFBF可能是一个好的开始(这是完全缓冲).要增加缓冲区大小,您还需要将大缓冲区大小指定为第四个参数,例如:

setvbuf(stdin,_IOFBF,16384);

这会动态分配缓冲区空间.根据具体情况,您可能希望将缓冲区传递给它:

char mybuffer[32768];

setvbuf(stdin,mybuffer,sizeof(mybuffer));

c – 自定义迭代器与std :: sort一起使用但不与tbb :: parallel_sort一起使用?

c – 自定义迭代器与std :: sort一起使用但不与tbb :: parallel_sort一起使用?

我试图使用tbb :: parallel_sort同时排序2个数组.英特尔的文档在这里说 https://software.intel.com/en-us/node/506167对迭代器和序列的要求与std :: sort相同.这似乎不是这种情况.我的自定义迭代器与std :: sort完美配合,但是使用tbb :: parallel_sort产生编译错误.请看下面的代码:
int main()//needs boost and tbb to compile{    int values_size = 6;    int nums1[] = {5,8,7,89,56,4};    int nums2[] = {2,1,4,9,2};    //WORKS!    std::sort(do_dual_sort.make_iter(nums1,nums2),do_dual_sort.make_iter(nums1+values_size,nums2+values_size),do_dual_sort.make_comp_desc(nums1,nums2));    //DOESN'T COMPILE    tbb::parallel_sort(do_dual_sort.make_iter(nums1,nums2));    for(unsigned int i = 0; i < values_size; i++) cout << "nums1[" << i << "] " << nums1[i] << " | nums2[" << i << "] "  << nums2[i] << "\n";    return 0;}class dual_sort{public:    template <class T,class T2>    struct helper_type {        public:            typedef boost::tuple<typename iterator_traits<T>::value_type,typename iterator_traits<T2>::value_type> value_type;            typedef boost::tuple<typename iterator_traits<T>::value_type&,typename iterator_traits<T2>::value_type&> ref_type;    };    template <typename T1,typename T2>    class dual_iterator : public boost::iterator_facade<dual_iterator<T1,T2>,typename helper_type<T1,T2>::value_type,boost::random_access_traversal_tag,T2>::ref_type> {    public:        explicit dual_iterator(T1 iter1,T2 iter2) : mIter1(iter1),mIter2(iter2) {}        typedef typename iterator_traits<T1>::difference_type difference_type;    private:        void increment() { ++mIter1; ++mIter2; }        void decrement() { --mIter1; --mIter2; }        bool equal(dual_iterator const& other) const { return mIter1 == other.mIter1; }        typename helper_type<T1,T2>::ref_type dereference() const { return (typename helper_type<T1,T2>::ref_type(*mIter1,*mIter2)); }        difference_type distance_to(dual_iterator const& other) const { return other.mIter1 - mIter1; }        void advance(difference_type n) { mIter1 += n; mIter2 += n; }        T1 mIter1;        T2 mIter2;        friend class boost::iterator_core_access;    };    template <typename T1,typename T2>    dual_iterator<T1,T2> make_iter(T1 t1,T2 t2) { return dual_iterator<T1,T2>(t1,t2); }    template <class T1,class T2> struct iter_comp_desc {        typedef typename helper_type<T1,T2>::value_type T;        bool operator()(const T& t1,const T& t2) const { return get<0>(t1) > get<0>(t2); }        bool operator()(const char*& t1,const char*& t2) const { return strcmp(get<0>(t1),get<0>(t2)) == 1; }    };    template <class T1,class T2> iter_comp_desc<T1,T2> make_comp_desc(T1 t1,T2 t2) { return iter_comp_desc<T1,T2>(); }} do_dual_sort;

我得到的编译错误是:

error C2512: 'dual_sort::dual_iterator<T1,T2>' : no appropriate default constructor availablewith[    T1=int *,T2=int *]tbb44_20150728oss\include\tbb/parallel_sort.h(201) : see reference to function template instantiation 'void tbb::internal::parallel_quick_sort<RandomAccessIterator,Compare>(RandomAccessIterator,RandomAccessIterator,const Compare &)' being compiledwith[    RandomAccessIterator=dual_sort::dual_iterator<int *,int *>,Compare=dual_sort::iter_comp_desc<int *,int *>]main.cpp(1125) : see reference to function template instantiation 'void tbb::parallel_sort<dual_sort::dual_iterator<T1,dual_sort::iter_comp_desc<T1,T2>>(RandomAccessIterator,const Compare &)' being compiledwith[    T1=int *,T2=int *,RandomAccessIterator=dual_sort::dual_iterator<int *,int *>]

编辑:我使用的编译器是Visual Studio 2012.您可以尝试用std替换一些boost函数以使其在g上工作.

解决方法

对于RandomAccessIterator,引用必须是对value_type的引用.它不能是引用的元组.

因此,您的双迭代器不是有效的RandomAccessIterator.

许多算法仍然有效,但这并不能使您的代码有效.

要求相同并不意味着任何与std :: sort的给定实现一起使用的东西也可以与tbb :: parallel_sort一起使用:std :: sort的给定实现不必强制执行所有要求.标准.

无论文档如何,如果实现不适用于您的代码,它将无法与您的代码一起使用.

最简单的方法可能是在原始数组中创建一对伪索引(或迭代器)数组,然后对其进行排序.你只需要覆盖<正常.

c# – 将SqlTransaction与SqlDataReader一起使用

c# – 将SqlTransaction与SqlDataReader一起使用

有很多人在网上谈论它,但这似乎不起作用.这是我得到的例外:

This sqlTransaction has completed; it is no longer usable.

这是代码

using (sqlConnection locationConnection = new sqlConnection(connectionString))
        {
            locationConnection.open();
            sqlTransaction transaction = locationConnection.BeginTransaction();
            sqlCommand cmd = new sqlCommand("
 Select stuff from table A
 Insert stuff into table B
 Delete stuff from table A",locationConnection,transaction); 

            using(sqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            //Doesn't matter
                        }                            
                    }

            //Exception happens here
            transaction.Commit();       
        }

任何人都可以阐明为什么会这样吗?如果我在sqlDataReader的范围内移动提交,我会得到一个例外,即datareader需要先关闭.

编辑:我已经回答了我的问题,并会在我被允许的情况下尝试记住接受它.

解决方法

问题是我得到了一个带有DELETE语句的sqlException(外键问题).这是关闭sqlconnection并结束事务,但它没有在我的代码中抛出异常,因为SELECT语句工作正常.我已经解决了sql问题,代码工作正常.如果有其他人遇到这个问题,他们应该能够以与我相同的方式做到这一点.

jquery-select2 – 将select2与json数据一起使用,该数据没有一个名为“text”的字段,同时避免复制项目并丢失标准行为

jquery-select2 – 将select2与json数据一起使用,该数据没有一个名为“text”的字段,同时避免复制项目并丢失标准行为

我正在使用select2,我想为没有渲染项的text属性设置自定义字段

>替换标准行为(标记等)
>将我的所有数组推入一个带有文本字段的新数组

> ps:我只想渲染许多没有文本字段的select2项

基本上如果你看到this jsbin,你会看到这样的东西

$("#e10_3").select2({
    data:{ results: data,text: function(item) { return item.tag; } },formatSelection: format,formatResult: format
});

但是如果我删除了select2的自定义formatSelection和formatResult参数,我就无法使用不同的字段来处理文本.

解决方法

如前所述,此解决方案可以创建一个新阵列,但考虑到可读性,它似乎是一种更好的方法.在传递数据之前,您应该修改它.你可以在 official docs看到这个
var data = $.map(yourArrayData,function (obj) { 
   obj.text = obj.text || obj.name; // desired field
   return obj;
});

唯一的另一种选择是从一开始就使用与所需属性匹配的文本属性来准备数据.

更新(添加了一个例子)

$('your-select2-el').select2
  data: $.map(yourArrayData,(obj) ->
    obj.text = obj.your_custom_field_name # obj.title or obj.name etc.
    obj
  )

请参阅我之前和this one之前提供的链接中的文档

我们今天的关于在C中将stdin与select一起使用的分享已经告一段落,感谢您的关注,如果您想了解更多关于c – 将setvbuf()与STDIN流一起使用、c – 自定义迭代器与std :: sort一起使用但不与tbb :: parallel_sort一起使用?、c# – 将SqlTransaction与SqlDataReader一起使用、jquery-select2 – 将select2与json数据一起使用,该数据没有一个名为“text”的字段,同时避免复制项目并丢失标准行为的相关信息,请在本站查询。

本文标签: