C:读取txt文件,根据情况重定向+追加到新文件中

问题描述 投票:0回答:1

我有一个输入txt文件,其中每第3行(“指令”行)最多4个字节,接下来的两行(“数据”行)每个最多16个字节。

如果指令行中的最后一个字符是字母,我想将该行以及接下来的2条数据行复制到新创建的文件“ letter_in.tmp”中。如果最后一个字符是数字,我只想将该指令行复制到文件“ number_in.tmp”,而跳过2条数据行。

我想使用重定向来做到这一点,尽管这不是必需的。这是我写的:

#define LETTER "letter_in.tmp"
#define NUMBER "number_in.tmp"
#define BUFSIZE 17

//argv[1] will be inputFile.txt
int main(int argc, char* argv[])
{
    if (argc != 2)
        usage_err(argc);

    int sav_stdin = dup(0);
    int sav_stdout = dup(1);

    redirect_files(argv[1]);

    return 0;
}


void redirect_files(char* inputF)
{
    FILE* fp = fopen(inputF, "r");

    char buffer[BUFSIZE];
    int fd_LetterIn = open_file(LETTER);
    int fd_NumberIn = open_file(NUMBER);

    //fdopen(fd_LetterIn, "a");
    //fdopen(fd_NumberIn, "a"); 

    unsigned char lastChar;

    while(fgets(buffer, sizeof(buffer), fp) != NULL) 
    {
        lastChar = isLetter(buffer[strlen(buffer) - 1]);
        if (lastChar == 1) //last character is a letter, so copy 3 lines to "letter_in.tmp"
        {
            dup2(fd_LetterIn, 1);
            lseek(fd_LetterIn, 0, SEEK_END);
            puts(buffer);
            fgets(buffer, sizeof(buffer), fp);
            puts(buffer);
            fgets(buffer, sizeof(buffer), fp);
            puts(buffer);
        }

        else
        {
            dup2(fd_NumberIn, 1);
            lseek(fd_NumberIn, 0, SEEK_END);
            write(fd_NumberIn, buffer, sizeof(buffer));
            fgets(buffer, sizeof(buffer), fp);
            fgets(buffer, sizeof(buffer), fp);
        }
    }
}

int open_file(char* name)
{
    int fd;
    fd = open(name, O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR);
    if (fd < 0)  // open failed
    {
        fprintf(stderr, "ERROR: open \"%s\" failed (%d). Exiting\n", name, fd);
        exit(2);
    }
    fprintf(stderr, "opened file %s, file descriptor is: %d\n", name, fd);
    return(fd);
}

样本输入inputFile.txt

3da
000a050a0a050a00
0000000005000005
1de
000a050a0a050a00
000005fb0002fb05
3e2
ec0af60a000000f6
f6ececece2f6e200
362
f600fbfb00fb0a00
0a05000afb0af605
195a
00f6fbf6f6fbf600
00000000fb0000fb

这实际上是我最终得到的:

enter image description here

enter image description here

1)为什么仅将所有内容写入number_in.tmp

2)为什么将复制的行混合在一起,而没有在新行上干净地打印? fgetsputs >>一次不能读/写1行吗?特别是因为我知道每行的最大长度是多少。 (我也尝试使用scanf()printf()write(),但没有一个起作用)。

3)如果我要成功使用fdopen(, "a"),就不需要使用dup2lseek,对吗?

4)假设从redirect_files()内部,我将标准输入/输出重定向到某个文件,但是在函数结束时不要将其更改回。当我跳回到main()时,标准输入/输出是否仍指向重定向的文件,还是与调用redirect_files()之前的文件相同?

我有一个输入txt文件,其中每三行(“指令”行)最多为4个字节,接下来的两行(“数据”行)最多为16个字节。如果......>

<<<<
您总是将\n传递给isLetter函数,请注意fgets\n附加到缓冲区。
lastChar = isLetter(buffer[strlen(buffer) - 1]);

应该是

    lastChar = isLetter(buffer[strlen(buffer) - 2]); //Add boundary checks.
c operating-system io-redirection
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.