- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
对于我的作业,我需要使用 fread/fwrite。我写
#include <stdio.h>
#include <string.h>
struct rec{
int account;
char name[100];
double balance;
};
int main()
{
struct rec rec1;
int c;
FILE *fptr;
fptr = fopen("clients.txt", "r");
if (fptr == NULL)
printf("File could not be opened, exiting program.\n");
else
{
printf("%-10s%-13s%s\n", "Account", "Name", "Balance");
while (!feof(fptr))
{
//fscanf(fptr, "%d%s%lf", &rec.account, rec.name, &rec.balance);
fread(&rec1, sizeof(rec1),1, fptr);
printf("%d %s %f\n", rec1.account, rec1.name, rec1.balance);
}
fclose(fptr);
}
return 0;
}
最佳答案
正如评论所说,fread
读取文件中的字节而无需任何解释。文件 clients.txt
由 50 个字符组成,第一行 16 个字符,第二行 14 个字符,第三行 18 个字符,加上两个换行符。 (你的clients.txt在第三行之后不包含换行符,你很快就会看到。)换行符是一个单字节\n
在 UNIX 或 Mac OS X 机器上,但(可能)两个字节 \r\n
在 Windows 机器上 - 因此是 50 或 51 个字符。这是十六进制的 ASCII 字节序列:
3130 3020 4a6f 6e65 7320 3536 342e 3930 100 Jones 564.90
0a32 3030 2052 6974 6120 3534 2e32 330a \n200 Rita 54.23\n
3330 3020 5269 6368 6172 6420 2d34 352e 300 Richard -45.
3030 00
fread
语句将这些字节直接复制到您的
rec1
中,无需任何解释。数据结构。该结构以
int account;
开头,表示将前四个字节解释为
int
.正如其中一条评论所指出的,您正在小端机器(最有可能是 Intel 机器)上运行您的程序,因此最低有效字节是第一个,最高有效字节是第四个字节。因此,您的
fread
据说可以解释四个 ASCII 字符的序列
"100 "
作为四字节整数
0x20303031
, 以十进制表示,等于
540028977
.结构体的下一个成员是
char name[100];
,这意味着
rec1
中接下来的 100 个字节的数据将是
name
.但是
fread
被告知阅读
sizeof(rec1)=112
字节(4 字节帐户,100 字节名称,8 字节余额)。由于您的文件只有 50(或 52)个字符,
fread
将只能填充
rec1
的那么多字节.
fread
的返回值,如果你没有丢弃它,会告诉你读取停止了你请求的字节数。自从您点击 EOF 后,
feof
在第一遍之后,调用中断循环,一口气消耗了整个文件。
fprintf
产生的。 .编号 540028977 及以下空格由
"%d "
产生和
rec1.account
争论。下一位只是部分确定的,你很幸运:
"%s"
说明符和相应的
rec1.name
参数将下一个字符打印为 ASCII 直到
\0
字节被发现。因此,输出将以
50-4
开头(或
52-4
)文件的剩余字符——包括两个换行符——并且可能会永远继续下去,因为没有
\0
文件(或任何文本文件)中的字节数,这意味着在打印文件的最后一个字符后,您看到的是自动变量
rec1
中发生的任何垃圾。当你的程序开始时。 (这种无意识的输出类似于 OpenSSL 中著名的 heartbleed 错误。)你很幸运垃圾中包含了
\0
字节后只有几十个字符。请注意
printf
没办法知道
rec1.name
被声明为只有一个 100 字节的数组——它只得到了指向
name
开头的指针-- 您有责任保证
rec1.name
包含终止
\0
字节,而你从未这样做过。
-9.2559631349317831e61
(在
"%f"
格式中很难看)是
rec1.balance
的值.该
double
的 8 个字节IEEE 754 机器(如您的 Intel 和所有现代计算机)上的值以十六进制表示
0xcccccccccccccccc
.六十四奇葩
╠
符号出现在
"%s"
输出对应于
rec1.name
,而 100 个字符只剩下 100-46 = 54 个字符,所以您的
"%s"
输出已结束
rec1.name
,并包括
rec1.balance
讨价还价,我们了解到您的终端程序解释了非 ASCII 字符
0xcc
如
╠
.有很多方法可以解释大于 127 (0x7f) 的字节;在 latin-1 中应该是
Ì
例如。图形字符
╠
是古代 MS-DOS 字符集中的 0xcc (204) 字节的表示,Windows 代码页 437。您不仅在 Intel 机器上运行,它还是 Windows 机器(当然最有可能开始) .
fread
来读取和解释文本文件。 .为此,您需要复制
libc
中的大部分代码。
fscanf
功能。唯一明智的方法是先使用
fwrite
创建一个二进制文件;然后
fread
会很自然地把它读回来。所以必须有两个程序——一个编写二进制文件
clients.bin
文件,然后再读一遍。当然,这并不能解决第一个程序的数据应该来自哪里的问题。它可能来自阅读
clients.txt
使用
fscanf
.或者它可以包含在
fwrite
的源代码中程序,例如通过初始化
struct rec
的数组像这样:
struct rec recs[] = {{100, "Jones", 564.90},
{200, "Rita", 54.23},
{300, "Richard", -45.00}};
fread
读取。 .
关于c - fread() c 中的一个结构体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33568577/
我有以下代码: int main() { char* pedal[20]; char* pedal2[20]; for (int i = 0; i < 20; i++)
我想用 in.wav 文件中的数据填充 hdr (结构)变量,并且我想复制 in 的前 64 个字节。 wav 文件转换为另一个文件 (out.wav)。 但是!当第二次使用fread()时,它开始从
我有一个由 1and1 托管的网站 - 他们没用!由于某种原因,他们提供的备份脚本不再有效,他们无法为我提供答案!所以我想我会自己写,这是我的代码: if (file_exists('backup
我正在尝试从文件中读取并将其复制到另一个文件。我正在网上查看一些代码,我似乎注意到有些人以这种方式声明 fread: fread (buffer, 1, 1000, src) 一些这样 fread (
当我是“男人的恐惧”时,我得到了: RETURN VALUE fread() and fwrite() return the number of items successfully read or
从文件中读取整数值时,覆盖率检查给出以下错误 调用函数“fread”会污染参数“readval” //coverity note: Calling function "fread" taints ar
为了更清楚地说明这一点,我将放置代码示例: $file = fopen('filename.ext', 'rb'); // Assume $pos has been declared // metho
尝试转换此 matlab 代码: fid = fopen([fpath, '/file.bin'],'rb'); content = fread(fid, 11,'single'); 我当前的尝试如下
假设我有: FILE* fp = fopen("myfile.bin", "r"); char something[30]; fread(something,sizeof(char)*30,1,fp)
fwrite 一个整数取决于字节序,但是有没有一种方法可以将一个整数 0x00000004 写入一个文件,这样无论它运行在什么机器上,它都可以始终被读取为 0x00000004。 一个想法是始终按照特
所以我尝试将此类 Matlab 代码转换为 C++: ss = 'file.mask' fp = fopen(ss, 'rb'); sx = fread(fp, 1, 'int32') sy = f
使用 C,可以使用函数 fread 来读取以 null 结尾的字符串吗? 我必须读取一个以 ip 开头的文件,该文件是 4 个无符号字符,后跟一个描述空终止字符串数的整数。之后,我需要读取字符串,直到
> fread('col1,col2\n') Empty data.table (0 rows) of 2 cols: col1,col2 > fread('col1,col2\n5,4') c
我正在尝试使用 data.table 将文件读入 R/fread .一些字段有前导零,我只想将数据作为字符读取并手动修复它们。但是我不知道如何将其传达给 fread .我正在尝试这个,它像往常一样分配
fread来自 data.table包一般可以在读取文件时自动确定列分隔符( sep )。 例如,这里fread自动检测 |作为列分隔符: library(data.table) fread(past
使用 fread,如何读取包含行名和列名的 CSV 文件。 我尝试了以下操作,但它没有正确读取行和列名称。 csv 文件看起来像(其中 C1、C2、C3 是列名,r1、r2、r3 是行名) input
我遇到了这样的文件: COL1 COL2 COL3 weqw asrg qerhqetjw weweg ethweth
我正在尝试使用 fread 读取表格。 txt 文件具有如下所示的文本: "No","Comment","Type" "0","he said:"wonderful|"","A" "1","Pr/ "
我正在尝试使用从 Apple 移动性报告生成的 csv,可以找到 here . 现在一切正常,我能够按预期获得 .csv,它看起来像这样的文字: csvtxt <- "geo_type,region,
我在 data.table (1.8.8, R 3.0.1) 中使用 fread 试图读取非常大的文件。 有问题的文件有 313 行和约 660 万列数字数据行,文件大小约为 12GB。这是具有 51
我是一名优秀的程序员,十分优秀!