3

我正在尝试从文本文件中提取部分行,并将其输出到 UNIX 平台下的 C 编程中的新文件中。例如,我有 file1.txt 如下:

设备:ABCDE1

日期:12/12/12

操作员=John Doe

我希望它在 file2.txt 中显示为:

ABCDE1,2012 年 12 月 12 日,约翰·多伊。

这是我到目前为止的代码,我打开并写入文件部分,但无法弄清楚如何在“设备:”之后提取信息,而不显示“设备:”它自己。我的代码只是复制 file1 的第一行,并将其放入文件 2:


#include "stdio.h"
main()
{
    FILE *fs, *ft;
    char ch ;
char file[100]="" ;
char Device [100];
char Date [80];

printf ("Enter file name and directory:");
scanf ("%s",&file);

    fs = fopen (file, "r") ;
    if ( fs == NULL )
    {
           puts ( "Cannot open source file" ) ;
           exit( ) ;
    }

    ft = fopen ( "file2.txt", "w" ) ;
    if ( ft == NULL )
    {
           puts ( "Cannot open target file" ) ;
           fclose ( fs ) ;
           exit( ) ;
    }


fscanf(fs, "%s %s", Device,Date);
fprintf(ft, "%s %s\n", Device,Date);


    fclose ( fs ) ;
    fclose ( ft ) ;
return 0;
}

fscanf() 是一个很好的命令吗?或者是否有任何其他建议的命令来完成这项工作?提前致谢。

4

3 回答 3

6

fscanf()是一种可能使用的功能。你会遇到“John Doe”的一些问题,因为 scanf() 系列函数将 %s 视为“空格分隔的字符串”——所以你会读到“John”,然后下一步会得到 Doe 和其他在下一行,这可能不是您想要的。

fscanf() 本身有解决这个问题的方法。或者,您可以使用 fgets() 读取整行,然后使用一些字符串函数将其拆分。有趣的是,线条的格式略有不同,这让生活更具挑战性。

我故意不告诉你具体怎么做,因为我很确定你这样做的部分原因是为了学习。而且你从抄袭别人的作品中得不到任何东西。

于 2012-12-21T00:44:25.537 回答
1

fscanf函数从文件中读取数据(第一个参数),根据给定的格式(第二个参数)解析它,并根据格式加载指定的变量(其余参数)。请参阅此处的定义。这意味着在您的 fscanf 调用之后,您的DeviceDate缓冲区拥有字符串Device:ABCDE1存储在其中。不要同时打印设备和日期,只需打印日期。您现在必须设置一个循环来遍历整个文件,fscanf'ing 直到您获得 EOF 标志并在每次迭代时只打印第二个字符串。

于 2012-12-21T00:46:15.003 回答
0

好的,所以我的代码开始工作了,它使用 igets 扫描字符串行,并使用printf(&buffer[7]); 仅在“设备:”之后输出答案。由于我将使用的记录将具有“设备、日期、操作员等”的固定位置,我什至不必搜索这些词,我只需将指针指向这些行。

但这是我的新问题,我当前的代码只读取文件的第一行,我怎样才能让它读取不同的行?例如,如果我只希望它读取第 1、2 和 5 行。

这是我的完整代码:

  main()
  {
    FILE *fs, *ft ;
    char ch ;
char file[100]="" ;
char line1[50];

printf ("Enter file name and directory:");
scanf ("%s",&file);

    fs = fopen (file, "r") ;
    if ( fs == NULL )
    {
           puts ( "Cannot open source file" ) ;
    }

    ft = fopen ( "book5.txt", "w" ) ;
    if ( ft == NULL )
    {
           puts ( "Cannot open target file" ) ;
           fclose ( fs ) ;
    }

    fgets(line1,50,fs);
printf(&line1[7]);
printf(",");
printf(&line1[7]);

    fclose ( fs ) ;
    fclose ( ft ) ;
 }

谢谢您的帮助!

于 2012-12-21T22:11:51.227 回答