从文件中读取多行数据

时间:2014-12-05 10:11:54

标签: c loops malloc

我正在读取预读取文件中的数据,并将其存储在缓冲区中,我在缓冲区中运行了一个结构体来组织数据,然后将其重新保存在另一个文件中。

但是我只读了一行代码。

我的代码   - 打开文件:

File *p_file

char fileLocation[40];
char buff[1000];

printf("\nEnter file name: \n");
scanf("%s, fileLocation);

p_file = fopen(fileLocation, "r");

if(!p_file)
{
    printf("\nError!\n");
}

循环读取数据并保存文件

while(fgets(buff, 1000, p_file)!=NULL
{
    printf("%s", buff);

    storedData.source = atoi(strtok(buff, ":");
    storedData.destination = atoi(strtok(0, ":");
    storedData.type = atoi(strtok(0, ":");
    storedData.port = atoi(strtok(0, ":");
    storedData.data = strtok(0, ":\n");

    printf("\nEnter a File Name to save:");
    scanf("%s", fileLocation);

 if ((p_file = fopen(fileLocation, "w")) == NULL
 {
    puts("\n Could not point to the file.");
 }else{
    printf("\nSaving");
    fprintf(p_file, "%04d:%04d:%04d:%04:%s \n",
            storedData.source,
            storedData.destination,
            storedData.type,
            storedData.port,
            storedData.data );

    fclose(p_file);
 }
fclose(p_file);

当前的数据输出:

0001:0002:0003:0021:CLS

想要输出数据:

0001:0002:0003:0021:CLS
0001:0010:0003:0021:CLS
0001:0002:0002:0080:<HTML>

我相信我必须声明一个整数值来用于循环文件内容以及使用malloc来获取结构的大小但是我不知道如何去做这个。任何帮助都感激不尽。

3 个答案:

答案 0 :(得分:1)

您过度使用p_file来读取文件以及要写入的文件。

if ((p_file = fopen(fileLocation, "w")) == NULL)

这样你就会丢失你打开阅读文件的指针。 当您在else部分fgets()中关闭它时,认为没有更多行。

使用其他一些变量来编写文件。


如果您想处理缓冲数据,请更改while(fgets()...以读取所有行,然后处理每一行。 fgets()不会读取多行。

答案 1 :(得分:1)

你的循环实际上只做了一次

storedData.data = strtok(0, ":\n");

所以你只需要第一行。

答案 2 :(得分:0)

FILE *in_file;
FILE *out_file;
char fileLocation[40];
char buff[1000];

printf("\nEnter file name: \n");
if( 1 != scanf(" %s, fileLocation) )
{
    perror( " scanf failed for input file: );
    exit( EXIT_FAILURE );
}

if( NULL == (in_file = fopen(fileLocation, "r") )
{
    perror( "fopen failed for input file" );
    exit( EXIT_FAILURE );
}

printf("\nEnter a File Name to save:");
if( 1 != scanf(" %s", fileLocation) )
{
    perror( "scanf failed for outut file name" );
    fclose( in_file ); // cleanup
    exit( EXIT_FAILURE );
}

if ( NULL == (out_file = fopen(fileLocation, "w")) )
{
    perror( " fopen failed for output file" );
    fclose( in_file ); // cleanup
    exit( EXIT_FAILURE )l
}

while(fgets(buff, 1000, p_file)!=NULL) )
{
    printf("%s", buff);

    storedData.source = atoi(strtok(buff, ":");
    storedData.destination = atoi(strtok(0, ":");
    storedData.type = atoi(strtok(0, ":");
    storedData.port = atoi(strtok(0, ":");
    storedData.data = strtok(0, ":\n");

    printf("\nSaving");
    fprintf(p_file, "%04d:%04d:%04d:%04:%s \n",
        storedData.source,
        storedData.destination,
        storedData.type,
        storedData.port,
        storedData.data );
} // end while

fclose( in_file );  // cleanup
fclose( out_file ); // cleanup