在C中读取包含long数组的文件

时间:2015-01-04 05:06:21

标签: c fopen readfile fread scanf

我正在尝试从我刚刚创建的long数组中获取数据但是我获得了不同的数据。

请参阅以下代码:

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

我得到的结果如下:

  • 写入数据
  • data [0]:140526045102081
  • data [1]:47
  • data [2]:197764
  • data [3]:140526045102080
  • 数据[4]:4096

我想保留write函数,因为它来自现有代码。我也试过功能fread但没有成功

  fread(data, sizeof(long ), 6, file);

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

它在这里工作。我对您的代码进行了以下更改:

//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函数或等效函数以动态方式分配所需的内存。

不要忘了,如果你想存储一些东西,首先要确保你有一个存储位置(即分配的内存)。如果你没有,你很可能会收到错误&#34; Segmentation Fault&#34; aka&#34; SIGSEGV&#34;这意味着你试图访问不属于你的内存。

此外,&#34; fscanf(文件,&#34;%ld&#34;,&amp; data [i]);&#34;将读&#34;文件&#34;作为文本,将尝试解析同一文本中的浮动。由于您将长片存储为长片而不是文本,因此您无法正常写作和阅读不同的内容。

答案 1 :(得分:1)

您正在将数组的二进制内容写入文件,然后尝试将其解释为长值,这显然不起作用。如果要将数字存储为文本,则必须在写入之前将其转换为文本,或使用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);
}