在 C 中读取包含 long 数组的文件
Read a file containing an array of long in C
我正在尝试从我刚刚创建的多头数组中获取数据,但我得到了不同的数据。
请看下面的代码:
#include <string.h>
#include "readfile.h"
int main()
{
long wr_data [6] ;
wr_data[0] = 11;
wr_data[1] = 1100;
wr_data[2] = 1122323;
wr_data[3] = 11333;
wr_data[4] = 11434243;
wr_data[5] = 1166587;
writeFile(wr_data);
readFile();
return(0);
}
int readFile()
{
FILE *file;
long * data
printf("Error Reading File\n");;
/* Open file for both reading and writing */
file = fopen(fileName, "r");
if (file == NULL)
{
printf("Error Reading File\n");
return -1;
}
for (int i = 0; i < 5; i++)
{
fscanf(file, "%ld", &data[i] );
printf("data[%d]: %ld \n",i, data[i]);
}
fclose(file);
return 0;
}
int writeFile(long * data)
{
FILE *fp;
if (data != NULL)
{
if ((fp = fopen(fileName,"w")) == NULL)
return -1;
if (*data !=0 )
fwrite(data,sizeof(long),6,fp);
printf("Write data\n");
fclose(fp);
}
return 0;
}
我得到的结果如下:
- 写入数据
- 数据[0]: 140526045102081
- 数据[1]: 47
- 数据[2]: 197764
- 数据[3]:140526045102080
- 数据[4]: 4096
我想保留写入函数,因为它来自现有代码。我也尝试了函数 fread 但没有成功
fread(data, sizeof(long ), 6, file);
在此先感谢您的帮助。
它在这里工作。我对您的代码进行了以下更改:
//needed for malloc
#include <stdio.h>
//needed for output
#include <stdlib.h>
...
char *fileName = "so";
...
//allocate memory to store the values
long *data = (long *)malloc(sizeof(long)*6);
...
//read the stored longs
fread(data, sizeof(long ), 6, file);
int i;
for(i=0; i<6; i++)
printf("%ld\n", data[i]);
你怎么看?
编辑:
嗯,主要的变化是内存分配。当您想存储任何类型的值时,您的程序需要由操作系统授予一个内存区域来存储这些值。
在这种情况下,我们有两个选择,要么创建一个固定大小的静态分配数组,要么使用 malloc 函数或等效函数以动态方式分配所需的内存。
别忘了,如果你想存储一些东西,首先要确保你有一个存储它的地方(即分配的内存)。如果你不这样做,你很可能会得到一个错误 "Segmentation Fault" 又名 "SIGSEGV",这意味着你试图访问不属于你的内存。
还有 "fscanf(file, "%ld", &data[i] );"将 "file" 读取为文本,并尝试从同一文本中解析浮点数。由于您将 longs 存储为 longs 而不是文本,因此这将不起作用,因为您正在编写和阅读不同的东西。
您正在将数组的二进制内容写入文件,然后尝试将其解释为很长的值,这显然是行不通的。如果您想将数字存储为文本,您必须在写入之前将它们转换为文本,或者使用 fprintf(FILE *, const char *, ...)
函数将它们打印到文件。
使用文本文件(您可能想要更改文件名)使用以下代码,它按预期工作。否则,您可以 fwrite
和 fread
全部内容,具体取决于您的需要。
#include <stdio.h>
const char *filename = "yourfile";
int readFile()
{
FILE *file;
long data[6];
int i;
printf("Error Reading File\n");;
/* Open file for both reading and writing */
file = fopen(filename, "r");
if (file == NULL)
{
printf("Error Reading File\n");
return -1;
}
for (i = 0; i < 6; i++)
{
fscanf(file, "%ld", &data[i] );
printf("data[%d]: %ld \n",i, data[i]);
}
fclose(file);
return 0;
}
int writeFile(long * data)
{
FILE *fp;
int i;
if (data != NULL)
{
if ((fp = fopen(filename,"w")) == NULL)
return -1;
if (*data !=0 )
{
for(i = 0; i != 6; ++i)
fprintf(fp, "%ld ", data[i]);
}
printf("Write data\n");
fclose(fp);
}
return 0;
}
int main()
{
long wr_data [6] ;
wr_data[0] = 11;
wr_data[1] = 1100;
wr_data[2] = 1122323;
wr_data[3] = 11333;
wr_data[4] = 11434243;
wr_data[5] = 1166587;
writeFile(wr_data);
readFile();
return(0);
}
我正在尝试从我刚刚创建的多头数组中获取数据,但我得到了不同的数据。
请看下面的代码:
#include <string.h>
#include "readfile.h"
int main()
{
long wr_data [6] ;
wr_data[0] = 11;
wr_data[1] = 1100;
wr_data[2] = 1122323;
wr_data[3] = 11333;
wr_data[4] = 11434243;
wr_data[5] = 1166587;
writeFile(wr_data);
readFile();
return(0);
}
int readFile()
{
FILE *file;
long * data
printf("Error Reading File\n");;
/* Open file for both reading and writing */
file = fopen(fileName, "r");
if (file == NULL)
{
printf("Error Reading File\n");
return -1;
}
for (int i = 0; i < 5; i++)
{
fscanf(file, "%ld", &data[i] );
printf("data[%d]: %ld \n",i, data[i]);
}
fclose(file);
return 0;
}
int writeFile(long * data)
{
FILE *fp;
if (data != NULL)
{
if ((fp = fopen(fileName,"w")) == NULL)
return -1;
if (*data !=0 )
fwrite(data,sizeof(long),6,fp);
printf("Write data\n");
fclose(fp);
}
return 0;
}
我得到的结果如下:
- 写入数据
- 数据[0]: 140526045102081
- 数据[1]: 47
- 数据[2]: 197764
- 数据[3]:140526045102080
- 数据[4]: 4096
我想保留写入函数,因为它来自现有代码。我也尝试了函数 fread 但没有成功
fread(data, sizeof(long ), 6, file);
在此先感谢您的帮助。
它在这里工作。我对您的代码进行了以下更改:
//needed for malloc
#include <stdio.h>
//needed for output
#include <stdlib.h>
...
char *fileName = "so";
...
//allocate memory to store the values
long *data = (long *)malloc(sizeof(long)*6);
...
//read the stored longs
fread(data, sizeof(long ), 6, file);
int i;
for(i=0; i<6; i++)
printf("%ld\n", data[i]);
你怎么看?
编辑: 嗯,主要的变化是内存分配。当您想存储任何类型的值时,您的程序需要由操作系统授予一个内存区域来存储这些值。
在这种情况下,我们有两个选择,要么创建一个固定大小的静态分配数组,要么使用 malloc 函数或等效函数以动态方式分配所需的内存。
别忘了,如果你想存储一些东西,首先要确保你有一个存储它的地方(即分配的内存)。如果你不这样做,你很可能会得到一个错误 "Segmentation Fault" 又名 "SIGSEGV",这意味着你试图访问不属于你的内存。
还有 "fscanf(file, "%ld", &data[i] );"将 "file" 读取为文本,并尝试从同一文本中解析浮点数。由于您将 longs 存储为 longs 而不是文本,因此这将不起作用,因为您正在编写和阅读不同的东西。
您正在将数组的二进制内容写入文件,然后尝试将其解释为很长的值,这显然是行不通的。如果您想将数字存储为文本,您必须在写入之前将它们转换为文本,或者使用 fprintf(FILE *, const char *, ...)
函数将它们打印到文件。
使用文本文件(您可能想要更改文件名)使用以下代码,它按预期工作。否则,您可以 fwrite
和 fread
全部内容,具体取决于您的需要。
#include <stdio.h>
const char *filename = "yourfile";
int readFile()
{
FILE *file;
long data[6];
int i;
printf("Error Reading File\n");;
/* Open file for both reading and writing */
file = fopen(filename, "r");
if (file == NULL)
{
printf("Error Reading File\n");
return -1;
}
for (i = 0; i < 6; i++)
{
fscanf(file, "%ld", &data[i] );
printf("data[%d]: %ld \n",i, data[i]);
}
fclose(file);
return 0;
}
int writeFile(long * data)
{
FILE *fp;
int i;
if (data != NULL)
{
if ((fp = fopen(filename,"w")) == NULL)
return -1;
if (*data !=0 )
{
for(i = 0; i != 6; ++i)
fprintf(fp, "%ld ", data[i]);
}
printf("Write data\n");
fclose(fp);
}
return 0;
}
int main()
{
long wr_data [6] ;
wr_data[0] = 11;
wr_data[1] = 1100;
wr_data[2] = 1122323;
wr_data[3] = 11333;
wr_data[4] = 11434243;
wr_data[5] = 1166587;
writeFile(wr_data);
readFile();
return(0);
}