在 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;
}

我得到的结果如下:

我想保留写入函数,因为它来自现有代码。我也尝试了函数 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 *, ...) 函数将它们打印到文件。

使用文本文件(您可能想要更改文件名)使用以下代码,它按预期工作。否则,您可以 fwritefread 全部内容,具体取决于您的需要。

#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);
}