使用C

时间:2016-11-24 23:35:46

标签: c

我希望将poem.txt中的所有其他单词大写,从每行开始。我创建了一个函数capitalize(),它接收一个字符串(例如:"一个孤独的数字,如root 3"),将每个其他单词大写并返回它(例如:返回"像Root 3这样的孤独数字#34;)。我试图从poem.txt读取每一行,将该行发送到capitalize()然后接收更新的字符串并用更新的字符串替换该行,但我无法弄清楚如何。我测试了我的程序,它可以读取文件的内容并将它们发送到capitalize()并逐行显示,但它不能写入和替换每一行。我尝试使用fprintf(),但它没有工作。你们能开导我吗?

poem.txt(执行前)
我担心我永远都会
一个孤独的数字,如根三
这三个是好的和正确的,
为什么我的三个人必须远离视线
在恶性的平方根标志下面,
我希望我是九岁
对于九个可以阻止这个邪恶的把戏,
只需一些快速算术
我知道我永远不会看到太阳,如1.7321
这是我的现实,一种悲伤的非理性
什么时候开玩笑!我看到了什么,
三个的另一个平方根
悄悄地来到华尔兹,
现在我们一起繁殖
形成一个我们喜欢的数字,
欣喜为整数
我们摆脱了我们的死亡债券
随着魔杖的浪潮
我们的方根标志变得脱胶
你对我的爱已经更新了

代码:

#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int reverse(int otherWord)
{
    if (otherWord)
        return 0;
    else
        return 1;
}
void capitalise(char *s)
{
     int start = 1;
     int otherWord = 1;
     for (; *s; s++)
     {
            if (start && otherWord)
                *s = toupper(*s);
            start = isspace(*s);
            if (start)
                otherWord = reverse(otherWord);

     }
}
int main(int argc, char *argv[])
{
    FILE * fp;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;

    fp = fopen("poem.txt", "r+");
    if (fp == NULL)
        exit(EXIT_FAILURE);

    while ((read = getline(&line, &len, fp)) != -1) {
        capitalise(line);
        fprintf(fp, "%s", line); // Here's the problem, this line!

    }

    fclose(fp);
    if (line)
        free(line);
    exit(EXIT_SUCCESS);
}

poem.txt(执行后):
我担心我永远都会
我担心我永远都会
EE
EE
 三是一切都是好的和正确的,
 三是这一切都很好而且对,
诅咒邪恶的平方根标志,
Eath the Vicious square Root sign,
ne可以阻止这个邪恶的伎俩,
Ne可以阻止这个邪恶的伎俩,
 知道我永远不会看到太阳,如1.7321
 知道我永远不会看到太阳,如1.7321
en hark!我看到了什么,
恩哈尔!这是什么我看到的,
Ë
Ë
悄悄地来到华尔兹,
S静静地来华尔兹舞,
形成一个我们喜欢的数字,
形成我们喜欢的号码,
我们脱离了我们的死亡债券
E从我们的凡人债券中解脱出来
uare根标志变得脱胶
Uare根标志变得脱胶
EDED

poem.txt(预期执行):
我担心我永远都会
一个孤独的数字像根三
...

3 个答案:

答案 0 :(得分:2)

发生行重复是因为您在写入原始文件的同时还要阅读它。

事实证明,从文件中删除和编辑行可能非常困难。如果要编辑文件中的行,可以使用一种简单的方法来写入新的临时文件,将其重命名为原始文件,然后删除临时文件。

答案 1 :(得分:2)

可以就地执行此操作,但这很危险,如果某些内容失败,您可能会丢失数据。

稍微简化的版本将是

#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int reverse(int otherWord)
{
  if (otherWord) {
    return 0;
  } else {
    return 1;
  }
}

void capitalise(char *s)
{
  int start = 1;
  int otherWord = 1;
  for (; *s; s++) {
    if (start && otherWord) {
      *s = toupper(*s);
    }
    start = isspace(*s);
    if (start) {
      otherWord = reverse(otherWord);
    }
  }
}

int main(void)
{
  FILE *fp;
  char *line = NULL;
  size_t len = 0;
  ssize_t read;
  long offset = 0L;
  int res;
  // you might prefer "w+" instead
  fp = fopen("poem.txt", "r+");
  if (fp == NULL) {
    fprintf(stderr, "Opening file poem.txt failed\n");
    exit(EXIT_FAILURE);
  }

  while ((read = getline(&line, &len, fp)) != -1) {
    capitalise(line);
    // set position relative to start of file
    if ((res = fseek(fp, offset, SEEK_SET)) < 0) {
      fprintf(stderr, "fseek failed\n");
      exit(EXIT_FAILURE);
    }
    // printing line sets file pointer to end of line
    fprintf(fp, "%s", line);
    // get that position
    offset = ftell(fp);
  }
  // fclose() might fail, too, see man-page for details
  fclose(fp);
  if (line) {
    free(line);
  }
  exit(EXIT_SUCCESS);
}

答案 2 :(得分:0)

如果我没记错的话,你应该能够重写文件的内容,因为它已经存在了标志&#34; w&#34;。替换你的&#34; r +&#34;用&#34; w&#34;