如何在C语言中将一个文本文件中的行复制到另一个文本文件中?

2j4z5cfb  于 2022-12-22  发布在  其他
关注(0)|答案(2)|浏览(232)

我有一个文本文件"input",其中一些行包含字符"$"。我想将此文件复制到一个新的文本文件" output "中,但要截断"$"字符(如果存在)之后(包括)的所有行。
我尝试了以下方法:

while (fgets(line, LINE_LENGTH, input) != NULL)
{
    strcpy(tmp_line, line);
    cmt_ptr = strchr(tmp_line, '$');
    if (cmt_ptr != NULL)
    {
        *cmt_ptr = '\n';
    }
    fputs(tmp_line, output);
}

这将编译,但每行中"$"之后的所有文本都将复制到新行中。
然后我试了这个:

while (fgets(line, LINE_LENGTH, input) != NULL)
{
    strcpy(tmp_line, line);
    cmt_ptr = strchr(tmp_line, '$');
    if (cmt_ptr != NULL)
    {
        strtok(tmp_line, '$');
    }
    fputs(tmp_line, output);
}

但是我收到一条错误消息,说"读取位置时发生访问冲突"。
谁能告诉我怎么更正密码?

3htmauhk

3htmauhk1#

下面的代码是不够的,因为只有$被替换为'\n'。要缩短字符串,请设置一个 *null字符 *。@一些程序员

if (cmt_ptr != NULL)
{
    *cmt_ptr = '\n';
    cmt_ptr[1] = '\0';  // Add
}

替代方法:找到$时使用不同的打印方式。不需要tmp_line

while (fgets(line, LINE_LENGTH, input) != NULL) {
  char *cmt = strchr(line, '$');
  if (cmt) {
    int length = cmt - line;
    printf("%.*s\n", length, line);  // Print limited character array.
  } else {
    fputs(line, output);
  }
}
wh6knrhe

wh6knrhe2#

使用fgets会使问题过于复杂,因为不需要读取整行。一次只读取一个字符。例如:

#include <stdlib.h>
#include <stdio.h>

FILE * xfopen(const char *path, const char *mode);

int
main(int argc, char **argv)
{
        FILE *input = argc > 1 ? xfopen(argv[1], "r") : stdin;
        FILE *output = argc > 2 ? xfopen(argv[2], "w") : stdout;
        enum { print, noprint } state = print;
        int c;
        while( (c = getc(input)) != EOF ){
                switch( c ){
                case '$':
                        state = noprint;
                        break;
                case '\n':
                        state = print;
                }
                if( state == print ){
                        putc(c, output);
                }
        }

        return 0;
}

FILE *
xfopen(const char *path, const char *mode)
{
        FILE *fp = path[0] != '-' || path[1] != '\0' ? fopen(path, mode) :
                *mode == 'r' ? stdin : stdout;
        if( fp == NULL ){
                perror(path);
                exit(EXIT_FAILURE);
        }
        return fp;
}

相关问题