Tag: 文件

使用C中的fputs写入文件

有人能告诉我为什么文件不会改变? 它在我使用rewind或fseek但不是。 在fgets之后使用fputs的标准方法是什么。 文件指示器位于第9位,因此fputs必须在此之后写入,但它不会执行任何操作。 在档案中: abcd efgh ijkl mnor 在源代码中: char c; char str[15]; FILE *fp = fopen(“d:\\data.txt”,”r+”); fgets(str, 10, fp); // fseek(fp, 9, SEEK_SET); // rewind(fp); printf(“%d\n”, ftell(fp)); // ftel shows that it’s in “9”. printf(“%s”, str); fputs(str, fp); // why its not working fclose(fp);

奇怪的0x0D被添加到我的二进制文件中

我有这个奇怪的问题: 我写了16个字符到一个二进制文件,然后我写了3个整数但是当我用一些二进制文件查看器打开我的文件时,我看到一个额外的字节被添加(等于0x0D )。 这是我的代码: for(i = 0; i < 16; i++) { if(i < strlen(inputStr)) { myCharBuf[0] = inputStr[i]; } else { myCharBuf[0] = 0; } fwrite(myCharBuf, sizeof(char), 1, myFile); } myIntBuf[0] = inputNumber1; fwrite(myIntBuf, sizeof(int), 1 ,myFile); myIntBuf[0] = inputNumber2; fwrite(myIntBuf, sizeof(int), 1 ,myFile); myIntBuf[0] = inputNumber3; fwrite(myIntBuf, sizeof(int), 1 ,myFile); 我得到以下字节值: 61 00 […]

fopen’d文件的默认输入和输出缓冲?

因此,FILE流可以同时具有输入和输出缓冲区。 您可以使用setvbuf调整输出流(我不知道任何使用输入缓冲区大小和行为的方法)。 此外,默认情况下缓冲区是BUFSIZ (不确定这是POSIX还是C的东西)。 很明显这对stdin / stdout / stderr意味着什么,但新打开文件的默认值是什么? 它们是否针对输入和输出进行缓冲? 或者也许只有一个? 如果它是缓冲的,输出默认为阻塞或行模式吗? 编辑:我已经做了一些测试,看看Jonathan Leffler的回答如何影响现实世界的节目。 看来,如果你做了一个读,那么写。 写入将导致输入缓冲区的未使用部分完全丢弃。 事实上,将会有一些寻求将事物保持在正确的文件偏移量。 我用这个简单的测试程序: /* input file contains “ABCDEFGHIJKLMNOPQRSTUVWXYZ” */ #include #include int main() { FILE *f = fopen(“test.txt”, “r+b”); char ch; fread(&ch, 1, 1, f); fwrite(“test”, 4, 1, f); fclose(f); return 0; } 导致以下系统调用: read(3, “ABCDEFGHIJKLMNOPQRSTUVWXYZ\n”, 4096) = 27 // […]

在c中将数据插入文件

我需要在现有文件中的第 45 个字节之前添加一个字符串。 我尝试使用fseek ,如下所示。 int main() { FILE *fp; char str[] = “test”; fp = fopen(FILEPATH,”a”); fseek(fp,-45, SEEK_END); fprintf(fp,”%s”,str); fclose(fp); return(0); } 我期望这段代码会在EOF的第 45 个字符之前添加“test”,相反,它只是将“test”附加到EOF。 请帮我找到解决方案。 这是我之前的问题的延续 将项添加到c中最后一行之前的文件中

二进制文件读/写C语言

所以我有一个input.bin文件,其中包含以下内容 IK-SZH;jdl72u;John Doe;2013-03-28 11:05 IK-GRR;kat91n;Jane Doe;2013-03-21 15:41 IK-GRR;oat62f;Jane Doe;2013-03-24 08:08 我正在做的是把它读成一个结构。 用数据做一些事情。 添加/删除行。 然后我想以与上面相同的格式将结构的内容写回input.bin文件。 但不是像上面那样出现。 就像这样(没有空格): IK-SZH NUL jdl72u NUL John Doe NUL NUL NUL NUL NUL 2013-03-28 NUL NUL NUL IK-GRR NUL kat91n NUL Jane Doe NUL NUL NUL NUL … 当我重新读取文件(使用NUL)时,它只将第1行放入结构中 我的代码 typedef struct foo { char kid[7]; char jid[7]; char name[21]; char […]

在文件> 2GB时,off_t没有-D_FILE_OFFSET_BITS = 64

1-我想知道,如果我尝试读取大小超过2GB的文件而不用使用off_t选项-D_FILE_OFFSET_BITS=64并使用此页面上的第二个函数编译我的程序,会出现什么问题? 它会段错吗? 2-我打算在off64_t和。下使用这个实现 #define _LARGEFILE64_SOURCE 1 #define _FILE_OFFSET_BITS 64 会有问题吗?

删除文件而不是将其标记为删除

我正在为Windows编写一个服务(从XP到8.1)。 我需要以递归方式删除文件夹,然后使用DeleteFile和RemoveDirectory 。 我不想使用SHFileOperation因为它具有MAX_PATH限制。 问题是,有时, RemoveDirectory失败并显示ERROR_DIR_NOT_EMPTY ,即使该目录为空。 我发现这是因为DeleteFile异步工作,它只“标记”一个文件进行删除。 因此,在调用RemoveDirectory之前添加一个小延迟(Sleep)可以解决问题。 但我正在寻找一种更清洁的方法。 那么,有没有办法确保标记的文件被正确删除? 我已经尝试直接在目录上调用FlushFileBuffers ,但没有成功。 编辑:有些人声称即使有句柄打开, NtDeleteFile也可以删除文件。 我刚刚检查过它,这是错误的,至少在Windows 8.1上:只有当所有句柄都关闭时才会删除文件。

C:将二进制文件读取到内存,更改缓冲区,将缓冲区写入文件

目标:用二进制数据打开文件,将整个文件读入内存,更改文件的某些部分,将内存缓冲区写入文件,关闭文件。 利润? 问题:我刚刚开始学习C,我找不到有关如何更改内存缓冲区中的二进制数据的足够信息。 来自Web开发人员背景(php,python,as3)这对我来说是一个新的领域。 上下文:我有一个函数,它接受文件的路径和指针地址到char指针的内存缓冲区。 然后它打开文件,遍历文件并将数据写入内存缓冲区。 最后关闭文件。 二进制文件的目的是为某些对象保存category-id,它们的位置是它们自己的id。 category-id表示为2字节短路。 所以基本上它只是一个二进制文件,里面装满了很多我希望能够阅读和更改的短裤。 这是我到目前为止所得到的: main.c中: #include “binary-handler.h” void showFileBuffer(char *buffer, unsigned int fileSize){ int i = 0; for(; i < fileSize; ++i){ printf("\n”, i, ((char *)buffer)[i]); } } int main(){ char path[] = “assets/map-squares.bin”; char *buffer; int fileSize; fileSize = readFileToMemory(path, &buffer); showFileBuffer(buffer, fileSize); //Code to change buffer […]

使用C创建立体声WAV文件

我正在寻找用C创建一个WAV file ,并在这里看到了一个例子。 这看起来不错,但我有兴趣添加两个缓冲区来制作音频立体声(每个耳朵可能有不同的声音) 。 如果我将通道数设置为2,则音频仅从左通道播放(显然是正确的,因为左声道是第一个通道)。 我已经读过我必须将它与正确的频道交错。 不幸的是,我没有找到很多在线帮助创建立体声WAV。 write_little_endian((unsigned int)(data[i]),bytes_per_sample, wav_file); 我试图创建第二个缓冲区,振幅减半,看看我是否可以交错。 for (j=0; i<BUF_SIZE; i++) { phase +=freq_radians_per_sample; buffertwo[i] = (int)((amplitude/2) * sin(phase));; } write_wav("test.wav", BUF_SIZE, buffer, buffertwo, S_RATE); (更改函数以获取两个短整数缓冲区) 而且只是做 write_little_endian((unsigned int)(data[i]),bytes_per_sample, wav_file); write_little_endian((unsigned int)(datatwo[i]),bytes_per_sample, wav_file); 但这不起作用。 理论上这应该是交错的。

如何从txt文件中读取制表符分隔的字符串并将它们放入变量中?

我有一个文件,我正在尝试阅读和填充变量。 该文件包含: 0\ttake a nap\n 1\tstudy heap-based priority queue\n 101\treview trees for Midterm 2\n 3\tdo assignment 7\n 这可能很难阅读,但你可以看到有一个整数开头,后面是一个标签,一个字符串,然后是换行符。 我需要取整数并将其放入变量,检测选项卡,并将选项卡后面的字符串放入变量,检测换行符,获取两个变量并创建包含该信息的节点,然后重新开始下一行。 经过几个小时的互联网搜索,这就是我想到的: char activity[SIZE]; char position[SIZE]; char line[100]; FILE *infile; char *inname = “todo.txt”; int i = 0; infile = fopen(inname, “r”); if (!infile) { printf(“Couldn’t open %s for reading\n”); return 0; } while(i < 100 && […]