【问题标题】:Add same text to end of each line in file from C将相同的文本添加到 C 文件中每一行的末尾
【发布时间】:2015-05-27 20:05:14
【问题描述】:

我正在尝试在文件的每一行末尾添加一个 -1。例如,file.txt 是

1 4 5
2 5 9
3 5 6

但会变成

1 4 5 -1
2 5 9 -1
3 5 6 -1

我正在弄清楚如何从 C 向文件中添加一般文本,但我无法弄清楚如何向文件中的每一行添加相同的文本,并确保新的行字符放在新的最后一个字符之后行中的字符(在本例中为 -1)。

这是我尝试过的:

FILE *f = fopen("file.txt", "w");
if (f == NULL)
{
    printf("Error opening file!\n");
    exit(1);
}

/* print some text */
const char *text = " -1";
fprintf(f, "%s\n", text);

非常感谢任何建议!

【问题讨论】:

  • 这不起作用吗?
  • 将文件指针移动到一行的\n 之前。使用fprintf(f, "%s", text);。对每一行执行此操作。
  • @CoolGuy 不会保留现有数据。
  • 这会更容易从命令行执行:cat infile.txt | sed 's/$/ -1/' > outfile.txt

标签: c file-io io printf


【解决方案1】:

我可以使用文本编辑器将-1 添加到每一行,方法是将"\r\n" 替换为" -1\r\n" 或类似文件,具体取决于文件的eol 格式。

或以编程方式,创建一个新文件,如下所示:

#include <stdio.h>
#include <string.h>

int main()
{
    FILE *fr, *fw;
    char buffer[10000];
    fr = fopen("file.txt","rt");
    if (fr == NULL) {
        printf("Error opening input file\n");
        return 1;
    }
    fw = fopen("file1.txt","wt");
    if (fw==NULL) {
        printf("Error opening output file\n");
        fclose (fr);
        return 1;
    }
    while (fgets(buffer, 10000, fr) != NULL) {
        buffer [ strcspn(buffer, "\r\n") ] = 0;   // remove trailing newline etc
        fprintf(fw, "%s -1\n", buffer);
    }
    fclose(fw);
    fclose(fr);
    return 0;
}

输出文件:

1 4 5 -1
2 5 9 -1
3 5 6 -1

【讨论】:

  • "wt" 和"rt" 作为fopen 的第二个参数有什么作用?
  • @CoolGuy 在文本模式下分别打开文件进行写入/读取,尽管“t”可能是不必要的。
【解决方案2】:

只需读取每个char,一次一个,并在检测到行尾时打印后缀。 然后打印读取的字符。

void Append(FILE *inf, FILE *outf, const char *suffix) {
  int ch;
  for (;;) {
    int ch = fgetc(inf);
    if (ch == '\n' || ch == EOF) {
      fputs(suffix, outf);
      if (ch == EOF) {
        break; 
      }
    }
    fputc(ch, outf);
  }
}

// Error checking omitted
char tmp[L_tmpnam];
tmpnam(tmp);
FILE *inf = fopen("file.txt", "r");
FILE *outf = fopen(tmp, "w");
Append(inf, outf, " -1");
fclose(inf);
fclose(outf);
remove("file.txt");
rename(tmp, "file.txt");

【讨论】:

    【解决方案3】:

    如果您同意使用两个单独的文件进行输入和输出,您的工作将非常轻松。实现你想要的算法可以设计如下

    • 打开输入文件,打开输出文件。 [fopen()]
    • 使用要在每行之后添加的常量输入值定义一个字符串。 [char * constvalue = "-1";]
    • 从输入文件中读取一行。 [fgets()##]
    • 使用fprintf()将从输入文件读取的数据和常量值一起写入。一些伪代码可能看起来像

      fprintf(outfile, "%s %s", readdata, constvalue);

    • 循环直到输入文件中有值 [while (fgets(infile....) != NULL)]
    • 关闭这两个文件。 [fclose()]

    ## -> fgets() 读取尾随换行符 \n 并将其存储到提供的缓冲区中。你可能想删除它。

    【讨论】:

    • 如果 '\n' 被移除,结果文件是 1 长行。如果保留'\n',则行以"\n -1" 结尾,而不是所需的" -1\n"。
    • @chux 先生,在fprintf() 的格式字符串末尾添加一个\n 可以解决这个问题,不是吗?
    • 使用修剪过的readdata、fprintf(outfile, "%s %s\n", ... 通常是可以的。例外 1:使用fgets() 读取的行没有以'\n' 结尾,有时与最后一行一样。例外 2:如果线路很长。 IAC,对于 OP 的练习来说可能已经足够了。
    猜你喜欢
    • 2013-04-05
    • 2014-11-13
    • 2023-02-07
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2014-05-29
    • 2013-06-24
    相关资源
    最近更新 更多