将相同的文本添加到C中文件中每行的末尾

时间:2015-03-24 13:25:37

标签: c file-io io printf

我正在尝试在文件的每一行的末尾添加-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);

非常感谢任何建议!

3 个答案:

答案 0 :(得分: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");

答案 1 :(得分:1)

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

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

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

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

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

答案 2 :(得分: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