我写了一个程序,它读取一个二进制文件,对其内容进行一些处理,并将结果写入另一个文件.在Linux中它可以很好地工作,但在Windows中它不起作用; 输出文件总是1KB ...
这是该程序的简化版本:
#include <stdio.h>
void copyFile(char* source, char* dest);
int main (int argc, char* argv[])
{
if (argc != 3)
printf ("usage: %s <source> <destination>", argv[0]);
else
{
copyFile(argv[1], argv[2]);
}
}
void encryptFile(char* source, char* destination)
{
FILE *sourceFile;
FILE *destinationFile;
int fileSize;
sourceFile = fopen(source, "r");
destinationFile = fopen(destination, "w");
if (sourceFile == 0)
{
printf ("Could not open source file\n");
return;
}
if (destinationFile == 0)
{
printf ("Could not open destination file\n");
return;
} …Run Code Online (Sandbox Code Playgroud) 它是否实际上逐个字符地读取或者是否将某些字节读入内核缓冲区并按字符返回到用户字符?
和它一样fgets吗?
让我说我使用glibc和gcc编译器.
我正在编写一个程序来读取stdin,然后写下它读取的内容stdout,取消它找到的任何转义的十六进制数字.我想读的所有数字都是8位.这就是我到目前为止所拥有的
while((c = fgetc(stdin)) != EOF) {
if(c == '%') {
fscanf(stdin,"%x",&r);
printf("%i \n",r);
}
}
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,除了当我写一些类似于%FFF标准输入的内容时,它将其读取为3位十六进制数.我该如何限制fscanf只读2个字符?我曾考虑将接下来的2个字符读入缓冲区sscanf'ing,但这对我来说感觉相当不优雅.
我有这个代码:
#include <stdio.h>
int main()
{
int i = 12345;
printf("%f", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
printf()将输出0.000000,不应该printf()将包含的位解释i为浮点数?
我正在将3D模型数据写入文件,同时包含许多不同类型的信息(网格,纹理,动画等),大小约为50到100 mb.
我想把所有这些放在一个文件中,但是如果我只需要读取该文件的一小部分来获得我想要的东西,我担心它会花费我.
我应该使用多个较小的文件,还是一个非常大的文件好吗?我不知道文件系统如何处理试图跳转巨型文件,所以我知道迭代大文件可能要么昂贵,要么根本没问题.
另外,如果使用单个大文件,我还有什么特别的事吗?
TL; DR:为什么freopen(NULL, "rb", stdin)在Windows 上总是失败?
我正在尝试base64在C中重新实现一个从stdin获取输入并将编码的等价物输出到stdout的编码器.我之前的帖子中有一个问题fread是过早发出EOF信号.这是我的主要方法:
int main(void)
{
unsigned char buffer[BUFFER_SIZE];
unsigned char base64_buffer[BASE64_BUFFER];
while (1)
{
TRACE_PUTS("Reading in data from stdin...");
size_t read = fread(buffer, 1, sizeof(buffer), stdin); /* Read the data in using fread(3) */
/* Process the buffer */
TRACE_PRINTF("Amount read: %zu\n", read);
TRACE_PUTS("Beginning base64 encode of buffer");
size_t encoded = base64_encode(buffer, read, base64_buffer, sizeof(base64_buffer));
/* Write the data to stdout */
TRACE_PUTS("Writing data to standard output"); …Run Code Online (Sandbox Code Playgroud) 我还没有掌握奇怪的shell stdio重定向的事情.
我想运行npm install但重定向stdout所以我不必看到所有这些.(我仍然希望在终端中捕获stderr,我只是不想看到stdout).
npm install -D suman 1> /dev/null
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用.
用于仅将stdout重定向到的正确语法(以及可能的原因)是/dev/null什么?
在 Linux(Ubuntu 平台)设备上,我使用一个文件来保存关键任务数据。
有时(大约 10,000 个案例中发生一次),文件会因不明原因而损坏。特别是,文件被截断(而不是一些 kbyte,它只有大约 100 个字节)。
现在,按照软件的顺序
紧接着,文件可能会再次打开 (4),并且正在执行其他操作。
到目前为止,我还没有注意到fflush(被调用fclose)不会写入文件系统,而只会写入中间缓冲区。可能是因为 3) 和 4) 之间的时间太短,并且 2) 的更改尚未写入磁盘,所以当我用 4) 重新打开时,我得到一个截断的文件,当它再次关闭时会导致永久丢失那些数据?
fsync()在这种情况下我应该在每次文件写入后使用吗?
停电需要考虑什么?数据损坏不太可能与断电有关。
我编写了一个程序,从文本文件的每一行读取四个变量(三个字符串和一个字符).但是当我显示变量时,每行末尾会弹出一个意外的字符.(我确保变量的长度足够大).
为什么是这样?(再次溢出缓冲区?)我该如何解决这个问题?
文本文件内容:
M0001 Cool Name F 123-456789 M0002 Name Cool M 987-654321
码:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *text;
char id[6], name[101], gender, contact[13];
text = fopen("test.txt", "r");
while (fscanf(text, "%s %[^\n]s %c %s\n", id, name, &gender, contact) != EOF)
printf("%s %s %c %s\n", id, name, gender, contact);
fclose(text);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我期望的输出:
M0001 Cool Name F 123-456789 M0002 Name Cool M 987-654321
我得到的是:
M0001 Cool Name F 123-456789 1?4 M0002 Name Cool M 987-654321 1?4
我正在研究 ncurses.h 因为我正在尝试学习一些 c 的设计方面,并且偶然发现了一个声明,说 stdio.h 在 ncurses 内部
#include <ncurses.h> /*ncurses.h includes stdio.h*/
Run Code Online (Sandbox Code Playgroud)
这是真的?如果是这样,有人可以向我解释原因,如果这意味着我不必再次包含它?
此外,这是否会导致任何问题,因为我没有在常规意义上对其进行准确定义