Tag: io

strlen没有给出正确的字符串长度C.

我正在从我的字典中读取并打印出单词+单词的长度以用于测试目的。 我使用strlen来获取字符串的长度。 但是,我得到的数字不正确。 我相信strlen不计算\ 0字符。 我正在读字典中的前10个单词。 我的预期输出应该是: W:AL:1 W:A’s L:3 W:AA’s L:4 W:AB’s L:4 W:ABM’s L:5 W:AC’s L:4 W:ACTH’s L:6 W:AI’s L:3 W:AIDS’s L:6 W:AM’s L:4 但这就是我得到的(请注意L:如何在另一条线上。我认为这就是问题所在): W:A L:2 W:A’s L:4 W:AA’s L:5 W:AB’s L:5 W:ABM’s L:6 W:AC’s L:5 W:ACTH’s L:7 W:AI’s L:5 W:AIDS’s L:7 W:AM’s L:5 以下是我的代码: FILE* dict = fopen(“/usr/share/dict/words”, “r”); //open the […]

C语言中的低级写作

如何使用C编程语言写入硬盘上的任何块? 关于编写MBR有一个问题 ,但它没有涵盖C方面那么多。 由于文件描述符 – 正如文字所说 – 对于文件,我想在这种情况下没有办法使用它们。 C标准库中包含的低级I / O也使用filedescriptors实现。 更准确地说: 这个问题更像是编写HDD块而不是文件(独立于操作系统)。 上面提到的问题的答案基本上建议在UNIX-Systems上使用dd (coreutils)。 这就是我在C中寻求一种方式的原因。也许bootloaders( GRUB )和引导扇区病毒使用不同的技术? 我想改变文件描述符内部的实际指针并不合法。 问题和局限: 我知道要记住某些方面,例如 某些操作系统限制对卷的直接访问(例如Windows) 写入错误以及将错误的数据写入某些块可能会导致文件系统损坏(HDD上的数据丢失)。 防病毒软件可能会将其标记为可疑代码。 这个问题更具理论性。

C – 将输出写入文件

EDIT: void print(const int *v, const int size) { FILE *fpIn; fpIn = fopen(“char-array.txt”, “a”); int i; if (v != 0) { for (i = 0; i < size; i++) { printf("%d", (int)v[i]); fprintf(fpIn, "%d\n", (int)v[i]); } perm_count++; printf("\n"); } fclose(fpIn); } 我想这是一个相对简单的问题:) 基本上该程序使用置换算法,并将输出打印到控制台中的标准输出。 我还想通过fprintf将内容写入文件。 虽然我似乎无法让它工作。 它只是将垃圾字符打印到文本文件的第一行,仅此而已! 我将粘贴下面的代码,非常感谢帮助! 在print函数中可以找到写入文件代码。 谢谢, T. #include #include #include #include […]

C:从stdin读取,直到按两次Enter键

考虑一个简单的程序。 它必须从stdin中获取5个数字的序列并打印它们的总和。 没有说明将采用多少行输入,但如果换行符被取两次(或按两次Enter键),程序必须终止。 例如, 输入: 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3/n /n 输出: 5 10 15 #include int main() { int n1, n2, n3, n4, n5; int sum; while (/*condition*/) { scanf (“%d %d %d %d %d\n”, &n1, &n2, &n3, &n4, &n5); sum = n1 + […]

是否在返回EOF后定义了getc()?

我用getc(); 在C练习中,在回顾程序后,我发现了一些奇怪的东西。 我假设在命令行参数上给出的文件至少包含一个字节。 (它连续两次调用getc();没有检查EOF 。在空文件上尝试它之后它仍然顺利运行。我的问题是: getc();的行为是否已经用完了文件指针(EOF有已经达到并且未被复活)未定义或是否会继续返回EOF? 我想我可以将这个问题扩展到C STL中的所有I / O函数,请在你的答案中澄清这一点。 这是该程序的代码。 该程序应该从所有注释中剥离C / C ++源文件(并且它完美地工作)。 #include int main(int argc, char *argv[]) { int state = 0; // state: 0 = normal, 1 = in string, 2 = in comment, 3 = in block comment int ignchar = 0; // number of characters to ignore int […]

有没有办法找到从文件中读取的当前行的行号?

1)在C中是否有一种方法可以找到我们从文件中读取的行的行号。 2)我还想知道是否有另一种方法可以找出文件中的总行数,而不是通过创建一个循环来查找每行中的EOF ,直到它到达结尾。

为什么这个语句在while循环中打印两次?

我写了这个简单的练习程序: #include #include #include #define CLASSES 3 #define STUDENTS 4 int grades[CLASSES][STUDENTS]; int main(void) { int i = 1; char t,k; while(i == 1) { printf(“\n\n\nMENU:\nEnter the grades(E)\nReport Grades(R)\nQuit(Q)\nYour choice: “); k = toupper(getchar()); printf(“Input entered… %c\n”, k); switch(k) { case ‘E’ : printf(“Entering the grades..\n”); break; case ‘R’ : printf(“Reporting the grades…\n”); break; case […]

为什么C ++输出比C慢得多?

我实际上是C ++的粉丝,但今天我发现程序的文件输出非常慢。 所以,我设计了一个实验来比较C ++文件输出的速度和C.假设我们有这段代码: int Num = 20000000; vector v; for ( int i = 0; i < Num; i++ ) { v.push_back(i); } 现在我运行两个单独的代码,一个用C ++编写: int now = time(0); cout << "start" << endl; ofstream fout("c++.txt"); for(size_t i = 0; i < v.size(); ++i) { fout<< v[i] << endl; } fout.close(); cout << time(0) […]

scanf何时开始和停止扫描?

当按下Enter键时, scanf似乎开始扫描输入,我想用下面的代码validation这一点(为简单起见,我省略了错误检查和处理)。 #include int main(int argc, char **argv) { /* disable buffering */ setvbuf(stdin, NULL, _IONBF, 0); int number; scanf(“%d”, &number); printf(“number: %d\n”, number); return 0; } 这是另一个问题,在我禁用输入缓冲之后(只是为了validation结果;我知道我应该接下来 – 实际上从不这样做,以防它干扰结果),输出是(注意额外的提示): $ ./ionbf 12(space)(enter) number: 12 $ $ 这与输入缓冲启用时的输出不同(无额外提示): $ ./iofbf 12(space)(enter) number: 12 $ 启用缓冲区时似乎消耗了新行字符。 我在两台不同的机器上进行了测试,一台安装了gcc 4.1.2和bash 3.2.25,另一台安装了gcc 4.4.4和bash 4.1.5,结果两者相同。 问题是: 如何在启用和禁用输入缓冲时解释不同的行为? 回到原来的问题, scanf什么时候开始扫描用户输入? 角色进入的那一刻? […]

如何通过pthreads管理两个或更多的消费者?

我有一个通用的问题,我希望解决,从标准输入或常规文件流发送到应用程序的二进制数据块,然后将二进制数据转换为文本。 使用线程,我想在将文本传递给下一个应用程序之前处理文本,然后进一步修改该文本,依此类推。 作为一个简单的测试用例,我想通过gunzip提取压缩数据。 具体来说,我正在使用gunzip -c -提取通过其(重新分配的) stdin文件描述符发送给它的二进制数据块,然后从其(重新分配的) stdout文件描述符中提取出大量文本。 然后我可以将这些文本块打印到真正的stdout或stderr (或者做其他事情,稍后再做)。 (我意识到我可以在命令行上进行基于gzip的压缩和提取。我的目标是使用这个测试用例来学习如何在通过二进制文件运行数据的线程之间正确传递二进制和文本数据的通用块,或进一步处理。) 在我的测试程序中,我设置了三个pthread_t线程: produce_gzip_chunk_thread consume_gzip_chunk_thread consume_gunzip_chunk_thread 我为每个线程传递了一个名为thread_data的共享数据实例,它包含一个线程锁,两个条件,以及一些缓冲区和计数器变量。 我还为使用popen3()打开的gunzip进程popen3() : typedef struct pthread_data pthread_data_t; typedef struct popen3_desc popen3_desc_t; struct pthread_data { pthread_mutex_t in_lock; pthread_cond_t in_cond; pthread_cond_t out_cond; unsigned char in_buf[BUF_LENGTH_VALUE]; size_t n_in_bytes; size_t n_in_bytes_written_to_gunzip; size_t n_out_bytes_read_from_gunzip; FILE *in_file_ptr; boolean in_eof; char in_line[LINE_LENGTH_VALUE]; popen3_desc_t *gunzip_ptr; }; struct popen3_desc […]