分析我的程序和功能打印需要花费大量时间来执行.如何将"原始"字节输出直接发送到stdout而不是使用fwrite,并使其更快(需要同时将print()中的所有9字节发送到stdout)?
void print(){
unsigned char temp[9];
temp[0] = matrix[0][0];
temp[1] = matrix[0][1];
temp[2] = matrix[0][2];
temp[3] = matrix[1][0];
temp[4] = matrix[1][1];
temp[5] = matrix[1][2];
temp[6] = matrix[2][0];
temp[7] = matrix[2][1];
temp[8] = matrix[2][2];
fwrite(temp,1,9,stdout);
Run Code Online (Sandbox Code Playgroud)
}
矩阵全局定义为无符号字符矩阵[3] [3];
最近,我一直在研究一些小数据序列化演示.但是,我想知道如何将二进制数据从结构传输到文件描述符.
我知道这样做的唯一(简单)方法是通过fwrite(如果write这样,那么请说出来),那么是否有:
A)fwrite对文件描述符使用的调用?
要么
B)一种创建FILE *现有文件描述符/套接字的方法,就像fileno?
我有以下示例代码
<?php
`echo test > /tmp/test.txt`;
$f=fopen("/tmp/test.txt","w+");
`rm /tmp/test.txt`;
var_dump(fwrite($f,"test"));
fclose($f);
file_get_contents("/tmp/test.txt");
Run Code Online (Sandbox Code Playgroud)
它创建一个文件,打开一个指向它的指针,删除该文件然后尝试写入它.现在我希望fwrite返回false或0,因为不会写入任何数据,但它会产生以下输出
int(4)
Warning: file_get_contents(/tmp/test.txt): failed to open stream: No such file or directory in /Stuff/tmp/test3 on line 7
Run Code Online (Sandbox Code Playgroud)
所以fwrite显然成功但file_get_contents按预期失败.
fwrite的预期行为是否返回要写入的字节数?如果是这样,我如何测试写入是否真的成功?
这是用php 5.3.3
我有一个fwrite函数来写入延迟插入到数据库的日志.
我们的访问率为每小时20,000次访问.
所以每个fwrite是0.18s.
我的问题是,当有2个或3个访问者同时进入时,PHP是否可能错过几个日志?
如果是的话那怎样才能让这个并发?
我的代码只是正常的Fopen fwrite fclose.
我正在尝试从数据库中导出一些信息,但是当创建CSV文件时,特殊字符看起来像这样 CategorÃa
这是我用来导出的代码
function exportemail() {
global $wpdb;
$content = "No.,Nombre,Empresa,Categoría,Estado de Prospecto,Correo,Teléfono,Dirección,Referido por,País,Sitio web,Contacto Alternativo,Trabajo de Contacto Alternativo,Correo de Contacto Alternativo,Teléfono de Contacto Alternativo,Dirección de Contacto Alternativo,País de Contacto Alternativo,Sitio Web de Contacto Alternativo,Notas,Rung";
if(trim($_GET['tab']) != "")
{
$sql = "SELECT * FROM ".$wpdb->prefix."crm WHERE
category LIKE '%".$wpdb->escape($_GET['tab'])."%'
ORDER BY name";
}
elseif (trim($searcharea) != '') {
$sql = "SELECT * FROM ".$wpdb->prefix."crm WHERE
name LIKE '%".$wpdb->escape($_GET['q'])."%'
OR last_name LIKE '%".$wpdb->escape($_GET['q'])."%'
OR category LIKE '%".$wpdb->escape($_GET['q'])."%'
OR business LIKE '%".$wpdb->escape($_GET['q'])."%' …Run Code Online (Sandbox Code Playgroud) 如何将值传递给struct变量我试图从用户那里获取员工信息,然后将其写入文件中,但我segmentation fault输入了员工姓名.这是我的代码.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct record_em{
int id;
char name[20];
int salary;
int age;
};
int main( void )
{
struct record_em employee;
FILE *fp;
int id, salary, age;
char name[20];
int n=1;
fp = fopen("empRecord.dat","a");
while(n==1){
printf("\nEnter Employee ID\n");
scanf("%d",&id);
employee.id=id;
printf("\nEnter Employee Name\n");
scanf("%s",name);
employee.name=name;
printf("\nEnter Employee Salary\n");
scanf("%d",&salary);
employee.salary=salary;
printf("\nEnter Employee Age\n");
scanf("%d",&age);
employee.age=age;
fwrite(&employee,sizeof(employee),1,fp);
printf("Enter 1 to add new record \n");
scanf("%d",&n);
}
fclose(fp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出(来自评论):
Fatmahs-MacBook-Air:~ fatmah$ …
当我运行这个小代码并在控制台上输入3个整数时,由于fwrite语句,它不会打印出来.只有在我继续按下输入一段时间后才打印.救命?PS:学习比scanf和printf更快的方法.
#include<stdio.h>
int main(){
int size[3];
fread(&size,sizeof(int),3,stdin);
fwrite(&size,sizeof(int),3,stdout);
fflush(stdout);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我用c ++编写了代码,用于加密和解密.第一个代码在向量中创建一个输出,然后使用fwrite将其写入文件,第二个代码使用fread从第一个代码读取输出.以下是我的代码片段:
第一个代码:
.....
string a;
vector<long long int> c;
cout << "message to be encrypted = ";
cin >> a;
cout << endl;
cout << "Encrypted message : ";
for (i=0;i<a.size();i++)
{
x=(int)a.at(i);
cout << x << " ";
c.push_back(powerMod(x,e,n));
}
for (i=0;i<c.size();i++)
{
//cout << char(c.at(i));
}
cout << endl;
//Write ciphertext c to a file
FILE * pWrite;
pWrite = fopen ("ciphertext", "w");
fwrite (&c , sizeof(c), 1, pWrite);
fclose (pWrite);
Run Code Online (Sandbox Code Playgroud)
输出是:
message to be encrypted = …Run Code Online (Sandbox Code Playgroud) 我正在尝试从头开始创建BMP文件,当时我发现了一个我无法解释的奇怪错误.我在这个极简主义程序中找出了错误:
int main()
{
FILE* ptr=NULL;
int success=0,pos=0;
ptr=fopen("test.bin","w");
if (ptr==NULL)
{
return 1;
}
char c[3]={10,11,10};
success=fwrite(c,1,3,ptr);
pos=ftell(ptr);
printf("success=%d, pos=%d\n",success,pos);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
success=3, pos=5
Run Code Online (Sandbox Code Playgroud)
使用test.bin文件的十六进制转储:
0D 0A 0B 0D 0A
Run Code Online (Sandbox Code Playgroud)
简而言之,无论你输入什么值而不是11(0x0B),fwrite都会正确写入.但由于某种原因,当fwrite遇到10(0x0A) - 并且恰好是这个值时 - 它会写入0D 0A,即2个字节,尽管我在fwrite参数中每次写入时明确指定了1个字节.因此,3个字节写入,如可在可见success变量,神秘5的ftell结果.
有人可以告诉我这里到底发生了什么......为什么10,为什么不97或28?
非常感谢您的帮助!
编辑:哦等等,我想我有一个想法......这不是与Unix上的0A和Windows上的0D 0A以及编译器的一些内部特征转换为另一个相关联吗?我怎么能强制它写出我想要的字节呢?
fwrite()在将要写入磁盘的数据移交给操作系统后,该函数是否返回,或者仅在数据实际物理写入磁盘后才返回?
对于我的情况,我希望这是第一种情况,因为我不想等到所有数据都被物理写入磁盘.我希望另一个操作系统线程在后台传输它.
在这种特殊情况下,我对Windows 10的行为感到好奇.
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/fwrite