Tabs durch leerzeichen ersetzen

12/21/2014 00:03 GeKiller#1
Hallo,

ich würde gerne Tabulatoren aus einer Datei in Leerzeichen umwandeln und natürlich auch immer die entsprechende Anzahl an Leerzeichen, weil diese ja nicht immer gleich sind.
Das ganze soll aber NUR in C geschehen und nicht in C++ und ich würde dafür auch keine extra Funktion benutzen, falls es eine gibt.

Das habe ich derzeit aber ich komme bei der Stelle mit dem Ersetzen einfach nicht weiter.

Code:
void MyReplace(FILE *file)
{
    int currChar = 0;
   
    if (file != NULL)
    {
        while((currChar = fgetc(file)) != EOF)
        {
            if(currChar == '\\') 
            {
                currChar = fgetc(file);
               
                if(currChar == 't') // 
                {
                    // Hier ist das Problem
                }
                else
                {
                    putchar(92); // == \
                    putchar(currChar);
                }
            }
            else
            {
                putchar(currChar); // Andere Zeichen ausgeben
            }
        }
    }
}
12/21/2014 05:04 MrSm!th#2
Da hast du etwas missverstanden. \t ist die Escape-Sequenz, die dein Compiler interpretiert und in das Tabulatorzeichen umwandelt. In der Datei steht eben genau dieses und nicht "\t".
Daher kannst du einfach das hier schreiben:

Code:
if(currChar == '\t')
Wobei man bedenken müsste, dass diese Herangehensweise nicht mit Unicode-Texten klarkommt.

Hier mal der ganze Code:

Code:
void MyReplace(FILE *file, int spaces_per_tab)
{
    int currChar = 0;
   
    if (file != NULL)
    {
        while((currChar = fgetc(file)) != EOF)
        {
            if(currChar == '\t') 
            {
                for (int i = 0; i < spaces_per_tab; i++)
                {
                	putchar(' ');
                }
            }
            else
            {
                putchar(currChar); // Andere Zeichen ausgeben
            }
        }
    }
}
12/21/2014 12:53 GeKiller#3
Das ist ja genau das Ding.

In der Datei stehen in dem Fall aber \t und so funktioniert das dann ja leider nicht? Zudem hat ein Tabulator ja nicht unbedingt immer nur 8 Leerzeichen, sondern manchmal sind es halt nur 3 bis zum nächsten Tabstop.
Wenn man auf die Tabulator Taste drückt fährt er ja immer zur nächsten durch 8 teilbaren Position fort.

Nur wie kann ich das berücksichtigen?
Damit komme ich grad absolut nicht weiter.
12/22/2014 12:49 Belur#4
Code:
void tabReplace(FILE *file)
{
    int currChar = 0;
    int i;
    int zaehler=0;
    if (file != NULL)
    {
        while((currChar = fgetc(file)) != EOF)
        {
            if(currChar == '\\' && fgetc(file)=='t')
            {
            int tmp = 8-(zaehler%8);
               for(i = 0; i<tmp; i++){
               putchar(' ');
               zaehler++;
               }
            }
            else
            {
                if(currChar == '\n'){
                zaehler=0;
                putchar(currChar);
                }else{
                zaehler++;
                putchar(currChar);
                }
            }
        }
    }
}
#Edit: Hatte noch ein Problem, falls ein Backslash kam und dann ein anderen Zeichen als "t" dahinter.
So sollte es dann gehen: