Rdhot
Rdhot

Reputation: 13

How to copy text from one file to another and then turning the first letters of the text string into uppercase

I am trying to build a program that copies text from one .txt file to another and then takes the first letter of each word in the text and switches it to an uppercase letter. So far, I have only managed to copy the text with no luck or idea on the uppercase part. Any tips or help would be greatly appreciated. This is what I have so far:

int main()
{
    std::ifstream fin("source.txt");
    std::ofstream fout("target.txt");
    fout<<fin.rdbuf(); //sends the text string to the file "target.txt"

    system("pause"); 
    return 0;
} 

Upvotes: 0

Views: 887

Answers (4)

Jason Yeung
Jason Yeung

Reputation: 81

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

int main() {
    FILE* fpin;
    FILE* fpout;
    int counter = 0;
    char currentCharacter;
    char previousCharacter=' ';

    fpin = fopen("source.txt", "r"); /* open for reading */
    if (fpin == NULL)
    {
        printf("Fail to open source.txt!\n");
        return 1;
    }

    fpout = fopen("target.txt", "w");/* open for writing */
    if (fpout == NULL)
    {
        printf("Fail to open target.txt!\n");
        return 1;
    }

    /* read a character from source.txt until END */
    while((currentCharacter = fgetc(fpin)) != EOF)
    {
        /* find first letter of word */
        if(!isalpha(previousCharacter) && previousCharacter != '-' && isalpha(currentCharacter))
        {
            currentCharacter = toupper(currentCharacter); /* lowercase to uppercase */
            counter++; /* count number of words */
        }
        fputc(currentCharacter, fpout); /* put a character to target.txt */

        /* printf("%c",currentCharacter); */

        previousCharacter = currentCharacter; /* reset previous character */
    }

    printf("\nNumber of words = %d\n", counter);
    fclose(fpin);   /* close source.txt */
    fclose(fpout);  /* close target.txt */
    return 0;
}

Upvotes: 0

ANjaNA
ANjaNA

Reputation: 1426

Try this, Take the file content to a string, then process it, and again write to the traget file.

int main()
{
  std::ifstream fin("source.txt");
  std::ofstream fout("target.txt");
  // get pointer to associated buffer object
  std::filebuf* pbuf = fin.rdbuf();
  // get file size using buffer's members
  std::size_t size = pbuf->pubseekoff (0,fin.end,fin.in);
  pbuf->pubseekpos (0,fin.in);
  // allocate memory to contain file data
  char* buffer=new char[size];
  // get file data
  pbuf->sgetn (buffer,size);
  fin.close();
  locale loc;
  string fileBuffer = buffer;
  stringstream ss;
  for (std::string::size_type i=0; i<fileBuffer.length(); ++i){
    if(i==0)
      ss << toupper(fileBuffer[i],loc);
    else if (isspace(c))
      ss << fileBuffer[i] << toupper(fileBuffer[++i],loc);
    else
      ss << fileBuffer[i];
  }

  string outString = ss.str();

  fout << outString;
  fout.close();

}

Upvotes: 1

Galik
Galik

Reputation: 48635

I think for this copying the whole file is not going to let you edit it. You can use get() and put() to process the file one character at a time. Then figure out how to detect the start of a word and make it uppercase:

Something like this:

int main()
{
    std::ifstream fin("source.txt");
    std::ofstream fout("target.txt");

    char c;
    while(fin.get(c))
    {
        // figure out which chars are the start
        // of words (previous char was a space)
        // and then use std::toupper(c)
        fout.put(c);
    }
}

Upvotes: 0

Tony Delroy
Tony Delroy

Reputation: 106196

Instead of copying the entire file at once, you'll need to read part or all of it into a local "buffer" variable - perhaps using while (getline(in, my_string)), then you can simply iterate along the string capitalising letters that are either in position 0 or preceeded by a non-letter (you can use std::isalpha and std::toupper), then stream the string to out. If you have a go at that and get stuck, append your new code to the question and someone's sure to help you out....

Upvotes: 0

Related Questions