C программа для добавления нумерации в файл txt

#c #text #struct #fopen #record

Вопрос:

У меня есть имя текстового файла myData.txt он содержит следующий текст:

 Bob Smith 5555556666
Wei Song 5555554444
George Snufolopolous 5555556666
William Kidd 5555554444
Hopalong Cassidy 5555556666
Lone Ranger 5555554444
Tonto Ng 5555556666
Pancho Vilas 5555554444
Cisco Kid 5555559999
 

Мне нужен текст файла myData.txt чтобы превратиться в следующее:

 1 Bob Smith 5555556666
2 Wei Song 5555554444
3 George Snufolopolous 5555556666
4 William Kidd 5555554444
5 Hopalong Cassidy 5555556666
6 Lone Ranger 5555554444
7 Tonto Ng 5555556666
8 Pancho Vilas 5555554444
 

Код, который я использую, написан на языке Си, и это:

 #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAXSIZE 8
struct Record
{

    int id;

    char firstName[31];

    char lastName[31];

    char cellPhone[11];
};

int main(void)
{
    struct Record record[MAXSIZE];
    int numberOfRecords = 0;
    FILE *fp = NULL;
    int i = 0;
    fp = fopen("myData.txt", "w");
    if (fp == NULL)
    {

        while (fscanf(fp, "%s %s %s", record[i].firstName,

                      record[i].lastName, record[i].cellPhone)

                   != EOF amp;amp;
               i < MAXSIZE)

        {

            record[i].id = i   1;

            numberOfRecords  ;

            i  ;
        }
    }

    fp = fopen("myData.txt", "a");

    if (fp == NULL)

    {

        for (i = 0; i < numberOfRecords; i  )

        {

            fprintf(fp, "%d%s%s%sn", record[i].id, record[i].firstName,

                    record[i].lastName, record[i].cellPhone);
        }
    }

    return 0;
}
 

Когда я компилирую этот код, файл myData.txt становится пусто. Что не так с этим кодом, пожалуйста, прокомментируйте ссылку на ресурсы, которые могли бы решить проблему.

Комментарии:

1. Почему вы открывали "myData.txt" дважды? В первый раз он был открыт для записи, так fscanf что не сработает, на самом деле вы его только что уничтожили. В стороне: вам нужно проверить fscanf , чтобы быть == 3 вместо != EOF этого .

2. @Shubham да, я пытаюсь поставить номер строки в начале каждой строки

3. В принципе, просто прочитайте строку fgets и запишите ее обратно printf("%u %s", number, line); , не нужно выполнять fscanf синтаксический анализ.

4.…и вы должны проверить это i < MAXSIZE перед записью в несуществующий элемент массива. Так while (i < MAXSIZE amp;amp; fscanf(...) == 3)

Ответ №1:

Во-первых, первое: вы всегда должны закрывать файл, прежде чем открывать его снова. Открытие файла дважды без закрытия может привести к повреждению файла, и вы потеряете данные.

Во-вторых, вы можете сделать это:

 1. use argc and argv to take myData.txt as command-line input
2. open myData.txt and one another file and
3. using fread() read each object in a struct Record's object and 
   write it to another file using fprintf(fp, "%i %s %s %s", i   1, ... );
4. repeat 3 until total number of objects are read or EOF is reached.
5. CLOSE both files and return
 

Здесь struct Record было бы как:

 struct Record
{
    char firstName[31];

    char lastName[31];

    char cellPhone[11];
};