我正在 Visual Studio 中编写程序。\n我使用fread和复制了一个文件fwrite。\n输出文件大小比输入文件大。\n你能解释一下原因吗?
#define _CRT_SECURE_NO_WARNINGS\n#include <stdio.h>\n#include <stdlib.h>\n#include <memory.h>\n\nint main()\n{\n char *buffer;\n int fsize;\n\n FILE *fp = fopen("test.txt", "r");\n FILE *ofp = fopen("out.txt", "w");\n fseek(fp, 0, SEEK_END);\n fsize = ftell(fp);\n\n buffer = (char *)malloc(fsize);\n memset(buffer, 0, fsize); // buffer\xeb\xa5\xbc 0\xec\x9c\xbc\xeb\xa1\x9c \xec\xb4\x88\xea\xb8\xb0\xed\x99\x94\n\n fseek(fp, 0, SEEK_SET);\n fread(buffer, fsize, 1, fp);\n\n fwrite(buffer, fsize, 1, ofp);\n\n fclose(fp);\n fclose(ofp);\n free(buffer);\n}\nRun Code Online (Sandbox Code Playgroud)\n 我正在使用fwrite()并且fread()第一次将一些数据结构写入磁盘,我对最佳实践和正确的处理方式有几个问题.
我正在写入磁盘(所以我以后可以读回来)是在Graph结构中插入的所有用户配置文件.每个图形顶点都是以下类型:
typedef struct sUserProfile {
char name[NAME_SZ];
char address[ADDRESS_SZ];
int socialNumber;
char password[PASSWORD_SZ];
HashTable *mailbox;
short msgCount;
} UserProfile;
Run Code Online (Sandbox Code Playgroud)
这就是我目前正在将所有配置文件写入磁盘的方式:
void ioWriteNetworkState(SocialNetwork *social) {
Vertex *currPtr = social->usersNetwork->vertices;
UserProfile *user;
FILE *fp = fopen("save/profiles.dat", "w");
if(!fp) {
perror("fopen");
exit(EXIT_FAILURE);
}
fwrite(&(social->usersCount), sizeof(int), 1, fp);
while(currPtr) {
user = (UserProfile*)currPtr->value;
fwrite(&(user->socialNumber), sizeof(int), 1, fp);
fwrite(user->name, sizeof(char)*strlen(user->name), 1, fp);
fwrite(user->address, sizeof(char)*strlen(user->address), 1, fp);
fwrite(user->password, sizeof(char)*strlen(user->password), 1, fp);
fwrite(&(user->msgCount), sizeof(short), 1, fp);
break;
currPtr = currPtr->next;
}
fclose(fp); …Run Code Online (Sandbox Code Playgroud) 我正在Linux服务器上运行PHP,并且我正在生成bash脚本,以便在使用PHP的fopen/fwrite的Mac计算机上使用.它的工作正常,除了行结尾被写为\ r \n而不仅仅是\n,这会在我尝试在Mac上运行脚本时导致错误.
如何强制fwrite使用\n代替\ r \n进行行结尾?我已经尝试过utf8_encoding我的文本和强制二进制模式,但我似乎无法搞清楚!
$scriptFile = "/path/to/my/script.sh";
$fh = fopen($scriptFile, 'w');
fwrite($fh, "$script");
fclose($fh);
Run Code Online (Sandbox Code Playgroud)
$ script是mysql中文本字段的内容,看起来有点像这样,通常是:
# comment
echo "numphotos 1"
# comment
/opt/local/bin/gphoto2 --capture-image-and-download -F 1
# comment
echo "696969"
Run Code Online (Sandbox Code Playgroud) 我想保留访问者的ips并将它们放在一个文件中.
我尝试了fwrite()函数,但我认为它是在previus ip on file上重写的.
例.
ip.txt是空的.
当我运行write.php脚本时,在ip.txt上我有xxxx ip(我的ip)
如果我的朋友运行write.php脚本,在ip.txt上我有aaaa ip(仅限朋友的ip)
我的IP在哪里?我想在ip.txt文件中有以下内容:
x.x.x.x ip1
a.a.a.a ip2
Run Code Online (Sandbox Code Playgroud)
write.php上的代码如下.
<?php
$file = fopen("ip.txt","w");
$ip=$_SERVER['REMOTE_ADDR'];
echo fwrite($file,$ip);
fclose($file);
?>
Run Code Online (Sandbox Code Playgroud) 我是C的新手,并且正在尝试编写一个程序来复制文件,以便我可以学习文件的基础知识.我的代码将文件作为输入,通过使用fseek和ftell从其末尾减去其开始来计算其长度.然后,它使用fwrite根据我从其手册页得到的内容,将一个数据元素(END - START)元素长写入OUT指向的流,从FI给出的位置获取它们.问题是,虽然它确实产生"复制输出",但文件与原始文件不同.我究竟做错了什么?我尝试将输入文件读入变量然后从那里写入,但这也没有帮助.我究竟做错了什么?谢谢
int main(int argc, char* argv[])
{
FILE* fi = fopen(argv[1], "r"); //create the input file for reading
if (fi == NULL)
return 1; // check file exists
int start = ftell(fi); // get file start address
fseek(fi, 0, SEEK_END); // go to end of file
int end = ftell(fi); // get file end address
rewind(fi); // go back to file beginning
FILE* out = fopen("copy output", "w"); // create the output file for writing
fwrite(fi,end-start,1,out); // write …Run Code Online (Sandbox Code Playgroud) 这就是我所拥有的:
$sep = "\t"; //tabbed character
$fp = fopen('registrars.xls', "w");
$schema_insert_rows = "";
//printing column names
$schema_insert_rows.="#" . $sep;
$schema_insert_rows.="Registrar" . $sep;
$schema_insert_rows.="Country" . $sep;
$schema_insert_rows.="Website" . $sep;
//$schema_insert_rows.="Postal Address" . $sep;
//$schema_insert_rows.="Contact Number" . $sep;
$schema_insert_rows.="Email Address" . $sep;
$schema_insert_rows.="\n";
fwrite($fp, $schema_insert_rows);
// printing data:
$row = 0; $i = 0; $schema_insert_rows = "";
$schema_insert_rows .= (++$row) . "" . $sep;
$schema_insert_rows .= $registrarArr[$i] . "" . $sep;
$schema_insert_rows .= $registrarArr[$i+1] . "" . $sep;
$schema_insert_rows .= $linkArr[$i] . …Run Code Online (Sandbox Code Playgroud) 我正在开发Linux环境下的C代码.我fwrite用来写一些数据到一些文件.该计划将在经常断电(至少每天一次)的环境中运行.因此,我想fwrite确保在写入数据时发生断电时不应更新该文件.它应该只在fwrite完成其工作时保存文件.如何fwrite在文件完成写入过程后才能使用该效果?
编辑:我使用fopen wb来丢弃文件中的先前信息并编写一个新文件,例如
FILE *rtng_p;
rtng_p = fopen("/etc/routing_table", "wb");
fwrite(&user_list, sizeof(struct routing), 40, rtng_p);
Run Code Online (Sandbox Code Playgroud)
并且它是一些非常小的数据,一些字节长
我正在努力学习如何使用fread和fwrite.在这里,我试图在标准输出上打印文件的内容.
#include <stdio.h>
int main()
{
FILE *fp;
fp = fopen("largest.c", "r+");
int c = fwrite(fp, sizeof(fp), 1, stdout);
printf("Output is 1 if write succesful! : %d\n", c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这不起作用.在屏幕上显示一些乱码.为什么?
我在fwrite()关闭流后遇到了一个奇怪的行为,fclose()但是文件没有被覆盖为fflush()失败.
我的代码是:
int main(int argc, char* argv[])
{
FILE* file = fopen("file.txt", "w");
if(!file) perror("Cannot open the file.\n");
char text[] = "1234567";
fclose(file);
int count_of_written_objects = fwrite(text, sizeof(text),1, file);
printf("Count of written objects into the file: %d \n", count_of_written_objects);
if(count_of_written_objects != 1) perror("Not expected count of objects was written.\n");
int success = fflush(file);
printf("Variable success: %d \n", success);
if(success == EOF) perror("Flush did not succeed. \n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它给出了以下输出:
Count of written objects …Run Code Online (Sandbox Code Playgroud) 我有一些协处理器可以修改的内存.我已将我的指针标记为volatile,但如果我将该内存用作fwrite中的源,我是否必须担心linux缓存(内核推迟复制,直到协处理器更改了该位置的数据)或其他任何内容?
例如:
volatile My_Data_t* samples;
fwrite((void *) samples, 4, 1, fp);
Run Code Online (Sandbox Code Playgroud)