#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];
};