我正在尝试将文件从指定的库复制到当前目录.我可以完美地复制文本文件.任何其他文件都会损坏.该程序在它应该之前检测到一个feof.
#include <stdio.h>
int BUFFER_SIZE = 1024;
FILE *source;
FILE *destination;
int n;
int count = 0;
int written = 0;
int main() {
unsigned char buffer[BUFFER_SIZE];
source = fopen("./library/rfc1350.txt", "r");
if (source) {
destination = fopen("rfc1350.txt", "w");
while (!feof(source)) {
n = fread(buffer, 1, BUFFER_SIZE, source);
count += n;
printf("n = %d\n", n);
fwrite(buffer, 1, n, destination);
}
printf("%d bytes read from library.\n", count);
} else {
printf("fail\n");
}
fclose(source);
fclose(destination);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 这是我为一个我正在研究的大型项目编写的测试程序.它与使用fwrite()将struct数据写入磁盘然后用fread()读取该数据有关.结构的一个成员是动态分配的.
首先,这是我的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STRING_LEN 128
struct Person {
int age;
char *name;
};
int main(int argc, const char *argv[])
{
struct Person *person = calloc(1, sizeof(struct Person));
person->age = 22;
person->name = calloc(STRING_LEN, sizeof(char));
char *name = "Name that is really, really, really, really, really, really, long.";
strncpy(person->name, name, STRING_LEN);
FILE *out_file = fopen("rw.out", "w");
fwrite(person, sizeof(struct Person), 1, out_file);
fclose(out_file);
FILE *in_file = fopen("rw.out", "r");
struct Person *person_read = calloc(1, sizeof(struct Person));
fread(person_read, …Run Code Online (Sandbox Code Playgroud) 我想知道这是否是解决问题的最佳方法.
我知道二进制文件的特定偏移的值,其中我想要的信息被保持...我想要做的是跳转到偏移然后从该位置开始读取一定量的字节.
在使用谷歌之后,我得出结论,我最好的选择是使用fseek()移动到偏移的位置,然后使用fread()从该位置读取一定量的字节.
我在想这个是正确的吗?如果是这样,最好怎么做呢?即如何将两者结合在一起.
如果我不对,你会建议我做什么呢?
非常感谢您的帮助.
马特
编辑:
我遵循了关于fread()的教程并将其调整为以下内容:
`#include <stdio.h>
int main()
{
FILE *f;
char buffer[11];
if (f = fopen("comm_array2.img", "rt"))
{
fread(buffer, 1, 10, f);
buffer[10] = 0;
fclose(f);
printf("first 10 characters of the file:\n%s\n", buffer);
}
return 0;
}`
Run Code Online (Sandbox Code Playgroud)
所以我使用文件'comm_array2.img'并从文件中读取前10个字符.
但据我所知,这是从文件开始,我想从文件中的某个位置(偏移)
这更有意义吗?
编辑2:
看起来我有点昏暗,所有需要的东西(从我的尝试看起来似乎)是将fseek()放在我在上面的代码中的fread()之前,它寻求到那个位置和然后从那里读.
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
int main()
{
FILE* bmp = NULL;
uint32_t offset;
uint8_t* temp = NULL;
size_t read;
unsigned int x_dim = 600, y_dim = 388;
bmp = fopen("test_colour.bmp", "r");
if (!bmp)
return -1;
/* Get the image data offset */
fseek(bmp, 10, SEEK_SET);
fgets((char*)&offset, 4, bmp);
printf("Offset = %u\n", offset);
temp = malloc(3*x_dim*y_dim*sizeof(uint8_t));
if (!temp)
return -1;
/* Go the the position where the image data is stored */
fseek(bmp, offset, SEEK_SET);
/* Copy image data …Run Code Online (Sandbox Code Playgroud) 可以fread从"data.table"强制成功使用"."作为sep值吗?
我正试图在"splitstackshape"中fread加速我的concat.split功能.请参见本要点对我采取的一般方法,以及这个问题我为什么要作出这样的转变.
我遇到的问题是将dot(".")视为一个值sep.每当我这样做时,我都会收到"意外字符"错误.
以下简化示例演示了此问题.
library(data.table)
y <- paste("192.168.1.", 1:10, sep = "")
x1 <- tempfile()
writeLines(y, x1)
fread(x1, sep = ".", header = FALSE)
# Error in fread(x1, sep = ".", header = FALSE) : Unexpected character (
# 192) ending field 2 of line 1
Run Code Online (Sandbox Code Playgroud)
我在当前函数中使用的解决方法是替换"."原始数据中希望不存在的另一个字符"|",但是这对我来说似乎有风险,因为我无法预测其他人的数据集中的内容.这是行动中的解决方法.
x2 <- tempfile()
z <- gsub(".", "|", y, fixed=TRUE)
writeLines(z, …Run Code Online (Sandbox Code Playgroud) 我想创建一个接口excel-R :: data.table.我想问一下如何在剪贴板中使用fread功能.以下代码运行良好,但我更喜欢使用fread而不是read.table(重现复制excel文件中的某些表并在R中运行上面的命令):
data.table(read.table("clipboard",sep="\t",header=TRUE))
Run Code Online (Sandbox Code Playgroud)
我尝试声明连接到剪贴板,但到目前为止无法使其工作.另外正如fread函数文档中所述,它会发生变化,有些东西可能会被弃用,因此有一个不会在不久的将来被弃用的解决方案可能会很好.剪贴板/ fread有限制吗?像65000行,或其他一些内存限制?
我还建议扩展data.table :: fread函数以默认接受'clipboard'连接,因为它当前与read.table一起工作.
谢谢
我有一个zip存档,里面有几个csv文件.我想使用fread将选定的csv文件导入R.
随着read.csv我可以得到的数据,而不提取存档如下.
con <- unz("myarchive.zip", "file2.csv")
file2 <- read.csv(con, header=T, sep=",", stringsAsFactors = FALSE)
on.exit(close(con))
Run Code Online (Sandbox Code Playgroud)
如何使用data.table::fread将csv文件中的数据导入到R存档而不提取它?
是否有getline使用fread(块I/O)而不是fgetc(字符I/O)的函数?
通过字符读取文件字符会有性能损失fgetc.我们认为为了提高性能,我们可以fread在内循环中使用块读取getline.然而,这引入了读取超过行尾的潜在不期望的效果.至少,这需要实现getline跟踪文件的"未读"部分,这需要超出ANSI C FILE语义的抽象.这不是我们想要自己实现的东西!
我们已经分析了我们的应用程序,并且由于我们逐个字符地消耗大型文件,因此性能缓慢fgetc.通过比较,其余的开销实际上具有微不足道的成本.我们总是按顺序读取文件的每一行,从头到尾,我们可以在读取期间锁定整个文件.这可能使fread基于getline更容易实现.
那么,是否存在getline使用fread(块I/O)而不是fgetc(字符I/O)的函数?我们非常肯定它确实如此,但如果没有,我们应该如何实施呢?
更新发现了一篇有用的文章,在C中处理用户输入,由Paul Hsieh撰写.这是一种fgetc基于方法的方法,但它对替代方案进行了有趣的讨论(从有多糟糕开始gets,然后讨论fgets):
另一方面,C程序员(甚至那些经验丰富的人)的常见反驳是说fgets()应该用作替代方案.当然,fgets()本身并不能真正处理用户输入.除了具有奇怪的字符串终止条件(在遇到\n或EOF,但不是\ 0时),当缓冲区达到容量时选择终止的机制是简单地突然停止fgets()操作并且\ 0终止它.因此,如果用户输入超过预分配缓冲区的长度,则fgets()返回部分结果.处理这个程序员有几个选择; 1)简单地处理截断的用户输入(没有办法向用户反馈输入已被截断,而他们提供输入)2)模拟可增长的字符数组并通过连续调用fgets()填充它.对于可变长度的用户输入,第一种解决方案几乎总是一个非常糟糕的解决方案,因为缓冲区在大多数情况下不可避免地会过大,因为它试图捕获太多普通情况,而对于异常情况则太小.第二种解决方案很好,只是正确实施可能很复杂.两者都不涉及fgets在'\ 0'方面的奇怪行为.
练习留给读者:为了确定通过调用fgets()确实读取了多少字节,可以尝试通过扫描(就像它一样)来搜索'\n'并跳过任何'\ 0'而不超过传递给fgets()的大小.解释为什么这对于流的最后一行是不够的.ftell()的弱点是什么阻止它完全解决这个问题?
练习留给读者:通过在每次调用fgets()之间用非零值覆盖整个缓冲区来解决确定fgets()消耗的数据长度的问题.
因此,使用fgets(),我们可以选择编写大量代码并使用与C库的其余部分不一致或具有任意截止的行终止条件.如果这还不够好,那么我们还剩下什么?scanf()以无法分离的方式将解析与读取混合,并且 …
我正在为一个 MOOC 项目工作,并且正在修补data.tableRStudio 中的包。使用该fread()函数导入数据文件最初工作正常:
fread("UCI HAR Dataset/features.txt")->features
fread("UCI HAR Dataset/test/y_test.txt")->ytest
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行以下代码行时,我收到一个弹出窗口,显示“R 会话中止:R 遇到致命错误。会话已终止。”
fread("UCI HAR Dataset/test/X_test.txt")->xtest
Run Code Online (Sandbox Code Playgroud)
我不明白问题是什么。我检查了文件名和路径以确保我正确拼写和大写了所有内容,然后全部检查出来。使用 read.table() 的等效代码工作正常并且不会导致 R 中止。我也尝试将文件重命名为“x_test.txt”,但发生了同样的问题。
根据?fread,只有该功能仅适用于“常规分隔文件”。据我所知,该文件是一个“常规分隔文件”,因为所有行都具有相同的列数。当我使用 read.table 时,没有包含“NA”的单元格;我检查使用anyNA(). 有没有一种快速的方法来确定文件是否是“定期”分隔的?原始文件是否还有其他可能导致问题的原因?
更新
经过进一步研究和搜索开发者github上列出的报告问题,我认为我的问题在于每行开头有两个空格,这里讨论。我不确定为什么 R 中止而不是给我一个警告。但是,data.table (1.9.5) 的最新开发版本不会导致会话在相同条件下中止。
我有一个 csv 文件,它有 Windows 行结尾(CR LF)并用分号分隔。文件的最后一行是空行,即不包含分号或任何其他字符。
当fread从data.table包中读取文件时,倒数第二行,即最后一个数据行,未加载,错误消息显示“丢弃单行页脚”。