Tag: file io

无法使用fopen()打开文件

我一直在尝试打开文件和输出文本,但我一直在收到错误。 所以我想我会从一开始就尝试打开文件。 这是我的代码: #include #include #define CORRECT_PARAMETERS 3 int main(void) { FILE *file; file = fopen(“TestFile1.txt”, “r”); if (file == NULL) { printf(“Error”); } fclose(file); } 当我运行该文件时,“错误”被打印到控制台,就是这样。 TestFile1.txt与我的.exe位于同一位置。 我该如何解决?

ftell在2GB以上的位置

在32位系统上,如果以二进制模式打开的文件的当前位置指示符超过2GB点, ftell返回什么? 在C99标准中,这是未定义的行为,因为ftell必须返回一个long int (最大值为2**31-1 )?

如何检查文件是否被gzip压缩?

我有一个C / C ++程序需要读取一个文件,该文件可能是也可能不是gzip压缩的。 我知道我们可以使用zlib中的gzread()来读取压缩文件和未压缩文件 – 但是,如果文件是gzip压缩的,我只想使用zlib函数(出于性能原因)。 那么有什么方法可以以编程方式检测或检查某个文件是否是从C / C ++中解压缩的?

在C中逐个字符地读取文件

大家好,我正在用C编写一个BF解释器,我遇到了读文件的问题。 我曾经使用scanf来读取第一个字符串,但是你的BF代码中没有空格或注释。 现在这就是我所拥有的。 char *readFile(char *fileName) { FILE *file; char *code = malloc(1000 * sizeof(char)); file = fopen(fileName, “r”); do { *code++ = (char)fgetc(file); } while(*code != EOF); return code; } 我知道问题出现在我如何将文件中的下一个字符分配给代码指针但是我不确定那是什么。 我的指针知识缺乏,这是本练习的重点。 解释器工作正常,都使用指针,我只是在读取文件时遇到问题。 (我打算稍后只在文件中读取“+ – > <[]。”,但是如果有人有好的方法,那么如果你让我知道的话会很棒!) 提前致谢

如何在C中打印到stdout和文件

我读了这个主题,但他的问题可能与我写入stdout和文件有所不同 我想写一个函数,该函数需要打印到stdout和一个文件。 我的C程序通过scanf获取用户输入。 我打算写一个像printf这样的函数,但我真的不知道如何: 我试过这个,但它只能用“纯”字符串,不能转换%d,%。* lf(我的打印function只需要两次转换) void dupPrint(FILE *fp,char *string) { printf(“%s”,string); fprintf(fp,”%s”,string); return; } 我试过dup2和freopen,但它们对我不起作用。 #include #include #include int main() { int i; int file = open(“input3.txt”, O_APPEND | O_WRONLY); if(file < 0) return 1; if(dup2(file,1) < 0) return 1; printf("Redirect to file!\n"); printf("enter i : "); scanf("%d",&i); return 0; } 这个dup2()教程只打印到文件。 我也试过tee,但可能不行,因为我必须得到用户的输入(如果工作,那不是“公平的”因为tee不在我的程序中)。 我认为实现类似printf会解决问题,但我不知道如何转换。* […]

如何在文件中间插入和删除一些字符?

我想在文件中间插入和删除一些字符。 fopen()和fdopen()只允许追加到最后。 是否有允许这些操作的简单方法或现有库?

为什么fread会提早到达EOF?

我正在编写一个将文件读入内存的C库。 它会跳过文件的前54个字节(标题),然后将余数作为数据读取。 我使用fseek来确定文件的长度,然后使用fread来读取文件。 循环运行一次然后结束,因为达到了EOF(没有错误)。 最后,bytesRead = 10624,ftell(stream)= 28726,缓冲区包含28726个值。 我希望fread读取30,000字节,当达到EOF时文件位置为30054。 C不是我的母语所以我怀疑我的某个地方有一个愚蠢的初学者错误。 代码如下: const size_t headerLen = 54; FILE * stream; errno_t ferrno = fopen_s( &stream, filename.c_str(), “r” ); if(ferrno!=0) { return -1; } fseek( stream, 0L, SEEK_END ); size_t bytesTotal = (size_t)(ftell( stream )) – headerLen; //number of data bytes to read size_t bytesRead = 0; […]

在磁盘I / O期间窗帘后面发生了什么?

当我在文件中寻找某个位置并写入少量数据(20个字节)时,幕后会发生什么? 我的理解 据我所知,可以从磁盘写入或读取的最小数据单元是一个扇区(传统上是512字节,但该标准现在正在改变)。 这意味着写入需要读取整个扇区的20个字节,在内存中修改其中一些并将其写回磁盘。 这是我期望在无缓冲I / O中发生的事情。 我还希望缓冲的I / O做大致相同的事情,但要聪明一点。 所以我会想,如果我通过随机搜索和写入来打破窗口的局部性,缓冲和无缓冲的I / O应该具有相似的性能……也许无缓冲的出现稍微好一些。 然后,我知道缓冲I / O仅缓冲一个扇区是疯狂的,所以我也可能期望它执行得非常糟糕。 我的应用程序 我正在存储由SCADA设备驱动程序收集的值,该驱动程序接收超过十万点的远程遥测。 文件中有额外的数据,每条记录为40个字节,但在更新期间只需要写入20个字节。 预执行基准 为了检查我是否需要想出一些出色的过度设计的解决方案,我已经使用写入文件的几百万随机记录进行了测试,该文件可能包含总共200,000条记录。 每个测试都使用相同的值对随机数发生器进行种子处理。 首先,我擦除文件并将其填充到总长度(大约7.6兆),然后循环几百万次,将随机文件偏移和一些数据传递给两个测试函数之一: void WriteOldSchool( void *context, long offset, Data *data ) { int fd = (int)context; lseek( fd, offset, SEEK_SET ); write( fd, (void*)data, sizeof(Data) ); } void WriteStandard( void *context, long offset, Data […]

在C中尝试和真正的简单文件复制代码?

这看起来像一个简单的问题,但我在这里找不到类似的东西。 由于C中没有文件复制function,我们必须自己实现文件复制,但我不喜欢重新发明轮子,即使是那样的琐碎事情,所以我想问云: 您建议使用fopen()/ fread()/ fwrite()进行文件复制的代码是什么? 您建议使用open()/ read()/ write()进行文件复制的代码是什么? 这段代码应该是可移植的(windows / mac / linux / bsd / qnx / younameit),稳定,经过时间测试,快速,内存效率高等等。欢迎进入特定系统的内部以挤出更多性能(比如获取文件系统簇大小) 。 这似乎是一个微不足道的问题,但是,例如,CP命令的源代码不是10行C代码。

C和C ++样式文件IO之间的性能差异

我一直听说C ++文件I / O操作比C风格I / O慢得多。 但是我没有找到任何关于实际有多缓慢的实际参考,所以我决定在我的机器上测试它(Ubuntu 12.04,GCC 4.6.3,ext4分区格式)。 首先,我在磁盘中写了一个~900MB的文件。 C ++( ofstream ):163s ofstream file(“test.txt”); for(register int i = 0; i < 100000000; i++) file << i << endl; C( fprintf ):12s FILE *fp = fopen(“test.txt”, “w”); for(register int i = 0; i < 100000000; i++) fprintf(fp, "%d\n", i); 我期待这样的输出,它表明在C ++ C中写入文件要慢得多。然后我使用C和C ++ I […]